日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一)

發(fā)布時間:2023/12/19 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在搭一個UI自動化測試框架,想把整個搭建過程分享出來,如果有不對的地方,希望大家能夠指正,首先創(chuàng)建一個名稱為,antomation_framework_demo的工程文件,

pycharm中工程及文件如下圖所示:

config:文件中包含調(diào)用的瀏覽器驅(qū)動及打開的URL地址

framework:

1、包含定義的頁面基類,封裝常用的頁面操作方法

2、包含打開瀏覽器操作以及在相對路徑下獲取瀏覽器driver

3、日志處理方法

logs:執(zhí)行日志以時間格式保存在該文件夾下,如:20190809162812.txt

pageobjects:定義homepage類,用來處理常用頁面操作方法的操作

screenshots:執(zhí)行截圖存放文件,命名格式與日志命名格式一致

test_report:存放執(zhí)行后生成的測試報告

testsuits:持續(xù)集成執(zhí)行方法

tools:瀏覽器驅(qū)動存放文件夾

好了,具體的包已經(jīng)創(chuàng)建完成了,現(xiàn)在開始看一下config文件,首先在config文件夾下右鍵新建->file文件->名稱輸入config.ini點擊確定,打開config.ini,輸入如下配置:

#配置文件,只存儲瀏覽器類型和服務(wù)器URL #調(diào)用的瀏覽器驅(qū)動,保留現(xiàn)在使用的瀏覽器驅(qū)動

[browserType] #browserName = Firefox

browserName = Chrome #browserName = IE #打開URL地址,以百度為例

[testServer] URL = https://www.baidu.com

framework包中文件如下所示:

在framework包下創(chuàng)建base_page.py文件,文件中封裝一些頁面常用操作方法,可以自己在這個類中進行對應(yīng)方法的添加,代碼如下:

1 # coding=utf-8

2 import time 3 from selenium.common.exceptions import NoSuchElementException 4 import os.path 5 from framework.logger import Logger 6

7 # create a logger instance

8 logger = Logger(logger="BasePage").getlog() 9

10

11 class BasePage(object): 12 """

13 定義一個頁面基類,讓所有頁面都繼承這個類,封裝一些常用的頁面操作方法到這個類 14 """

15

16 def __init__(self, driver): 17 self.driver = driver 18

19 # quit browser and end testing

20 def quit_browser(self): 21 self.driver.quit() 22

23 # 瀏覽器前進操作

24 def forward(self): 25 self.driver.forward() 26 logger.info("Click forward on current page.") 27

28 # 瀏覽器后退操作

29 def back(self): 30 self.driver.back() 31 logger.info("Click back on current page.") 32

33 # 隱式等待

34 def wait(self, seconds): 35 self.driver.implicitly_wait(seconds) 36 logger.info("wait for %d seconds." % seconds) 37

38 # 點擊關(guān)閉當(dāng)前窗口

39 def close(self): 40 try: 41 self.driver.close() 42 logger.info("Closing and quit the browser.") 43 except NameError as e: 44 logger.error("Failed to quit the browser with %s" % e) 45

46 # 保存圖片

47 def get_windows_img(self): 48 """

49 在這里我們把file_path這個參數(shù)寫死,直接保存到我們項目根目錄的一個文件夾.\Screenshots下 50 """

51 file_path = os.path.dirname(os.path.abspath(‘.‘)) + ‘\screenshots\\‘

52 rq = time.strftime(‘%Y%m%d%H%M%S‘, time.localtime(time.time())) 53 screen_name = file_path + rq + ‘.png‘

54 try: 55 self.driver.get_screenshot_as_file(screen_name) 56 logger.info("Had take screenshot and save to folder : \screenshots") 57 except NameError as e: 58 logger.error("Failed to take screenshot! %s" % e) 59 self.get_windows_img() 60

61 # 定位元素方法

62 def find_element(self, selector): 63 """

64 這個地方為什么是根據(jù)=>來切割字符串,請看頁面里定位元素的方法 65 submit_btn = "id=>su" 66 login_lnk = "xpath => //*[@id=‘u1‘]/a[7]" # 百度首頁登錄鏈接定位 67 如果采用等號,結(jié)果很多xpath表達式中包含一個=,這樣會造成切割不準(zhǔn)確,影響元素定位 68 :param selector: 69 :return: element 70 """

71 element = ‘‘

72 if ‘=>‘ not in selector: 73 return self.driver.find_element_by_id(selector) 74 selector_by = selector.split(‘=>‘)[0] 75 selector_value = selector.split(‘=>‘)[1] 76

77 if selector_by == "i" or selector_by == ‘id‘: 78 try: 79 element = self.driver.find_element_by_id(selector_value) 80 logger.info("Had find the element \‘ %s \‘ successful "

81 "by %s via value: %s " % (element.text, selector_by, selector_value)) 82 except NoSuchElementException as e: 83 logger.error("NoSuchElementException: %s" % e) 84 self.get_windows_img() # take screenshot

85 elif selector_by == "n" or selector_by == ‘name‘: 86 element = self.driver.find_element_by_name(selector_value) 87 elif selector_by == "c" or selector_by == ‘class_name‘: 88 element = self.driver.find_element_by_class_name(selector_value) 89 elif selector_by == "l" or selector_by == ‘link_text‘: 90 element = self.driver.find_element_by_link_text(selector_value) 91 elif selector_by == "p" or selector_by == ‘partial_link_text‘: 92 element = self.driver.find_element_by_partial_link_text(selector_value) 93 elif selector_by == "t" or selector_by == ‘tag_name‘: 94 element = self.driver.find_element_by_tag_name(selector_value) 95 elif selector_by == "x" or selector_by == ‘xpath‘: 96 try: 97 element = self.driver.find_element_by_xpath(selector_value) 98 logger.info("Had find the element \‘ %s \‘ successful "

99 "by %s via value: %s " % (element.text, selector_by, selector_value)) 100 except NoSuchElementException as e: 101 logger.error("NoSuchElementException: %s" % e) 102 self.get_windows_img() 103 elif selector_by == "s" or selector_by == ‘selector_selector‘: 104 element = self.driver.find_element_by_css_selector(selector_value) 105 else: 106 raise NameError("Please enter a valid type of targeting elements.") 107

108 return element 109

110

111 # 輸入

112 def type(self, selector, text): 113

114 el = self.find_element(selector) 115 el.clear() 116 try: 117 el.send_keys(text) 118 logger.info("Had type \‘ %s \‘ in inputBox" % text) 119 except NameError as e: 120 logger.error("Failed to type in input box with %s" % e) 121 self.get_windows_img() 122

123 # 清除文本框

124 def clear(self, selector): 125

126 el = self.find_element(selector) 127 try: 128 el.clear() 129 logger.info("Clear text in input box before typing.") 130 except NameError as e: 131 logger.error("Failed to clear in input box with %s" % e) 132 self.get_windows_img() 133

134 # 點擊元素

135 def click(self, selector): 136

137 el = self.find_element(selector) 138 try: 139 el.click() 140 logger.info("The element \‘ %s \‘ was clicked." % el.text) 141 except NameError as e: 142 logger.error("Failed to click the element with %s" % e) 143

144 # 或者網(wǎng)頁標(biāo)題

145 def get_page_title(self): 146 logger.info("Current page title is %s" % self.driver.title) 147 return self.driver.title 148

149 @staticmethod 150 def sleep(seconds): 151 time.sleep(seconds) 152 logger.info("Sleep for %d seconds" % seconds)

browser_engine.py中封裝獲取根目錄下瀏覽器驅(qū)動方法和瀏覽器操作方法,但需要注意的是,如果在里面使用中文,需要切換方法,但是小編在切換了以后還是不對,可能是因為使用2.7版本python吧,用3.x版本的朋友可以嘗試一下使用中文進行日志打印的操作,代碼如下:

1 # -*- coding:utf-8 -*-

2 import ConfigParser 3 import os.path 4 from selenium import webdriver 5 from framework.logger import Logger 6

7 logger = Logger(logger="BrowserEngine").getlog() 8

9

10 class BrowserEngine(object): 11 dir = os.path.dirname(os.path.abspath(‘.‘)) # 注意相對路徑獲取方法

12 chrome_driver_path = dir + ‘/tools/chromedriver.exe‘

13 ie_driver_path = dir + ‘/tools/IEDriverServer.exe‘

14

15 def __init__(self, driver): 16 self.driver = driver 17

18 # read the browser type from config.ini file, return the driver

19 def open_browser(self, driver): 20 config = ConfigParser.ConfigParser() 21 # file_path = os.path.dirname(os.getcwd()) + ‘/config/config.ini‘

22 file_path = os.path.dirname(os.path.abspath(‘.‘)) + ‘/config/config.ini‘

23 config.read(file_path) 24 # config.read(file_path,encoding=‘UTF-8‘), 如果代碼有中文注釋,用這個,不然報解碼錯誤

25

26 browser = config.get("browserType", "browserName") 27 logger.info("You had select %s browser." % browser) 28 url = config.get("testServer", "URL") 29 logger.info("The test server url is: %s" % url) 30

31 if browser == "Firefox": 32 driver = webdriver.Firefox() 33 logger.info("Starting firefox browser.") 34 elif browser == "Chrome": 35 driver = webdriver.Chrome(self.chrome_driver_path) 36 logger.info("Starting Chrome browser.") 37 elif browser == "IE": 38 driver = webdriver.Ie(self.ie_driver_path) 39 logger.info("Starting IE browser.") 40

41 driver.get(url) 42 logger.info("Open url: %s" % url) 43 driver.maximize_window() 44 logger.info("Maximize the current window.") 45 driver.implicitly_wait(10) 46 logger.info("Set implicitly wait 10 seconds.") 47 return driver 48

49 def quit_browser(self): 50 logger.info("Now, Close and quit the browser.") 51 self.driver.quit()

總結(jié)

以上是生活随笔為你收集整理的python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。