最近在搭一个UI自动化测试框架,想把整个搭建过程分享出来,如果有不对的地方,希望大家能够指正,首先创建一个名称为,antomation_framework_demo的工程文件,
pycharm中工程及文件如下图所示:
config:文件中包含调用的浏览器驱动及打开的URL地址
framework:
1、包含定义的页面基类,封装常用的页面操作方法
2、包含打开浏览器操作以及在相对路径下获取浏览器driver
3、日志处理方法
logs:执行日志以时间格式保存在该文件夹下,如:20190809162812.txt
pageobjects:定义homepage类,用来处理常用页面操作方法的操作
screenshots:执行截图存放文件,命名格式与日志命名格式一致
test_report:存放执行后生成的测试报告
testsuits:持续集成执行方法
tools:浏览器驱动存放文件夹
好了,具体的包已经创建完成了,现在开始看一下config文件,首先在config文件夹下右键新建->file文件->名称输入config.ini点击确定,打开config.ini,输入如下配置:
#配置文件,只存储浏览器类型和服务器URL
#调用的浏览器驱动,保留现在使用的浏览器驱动
[browserType]
#browserName = Firefox
browserName = Chrome
#browserName = IE
#打开URL地址,以百度为例
[testServer]
URL = https://www.baidu.com
framework包中文件如下所示:
在framework包下创建base_page.py文件,文件中封装一些页面常用操作方法,可以自己在这个类中进行对应方法的添加,代码如下:
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 # 点击关闭当前窗口
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这个参数写死,直接保存到我们项目根目录的一个文件夹.\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 这个地方为什么是根据=>来切割字符串,请看页面里定位元素的方法
65 submit_btn = "id=>su"
66 login_lnk = "xpath => //*[@id='u1']/a[7]" # 百度首页登录链接定位
67 如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位
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 # 或者网页标题
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中封装获取根目录下浏览器驱动方法和浏览器操作方法,但需要注意的是,如果在里面使用中文,需要切换方法,但是小编在切换了以后还是不对,可能是因为使用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()
标签:info,python,self,driver,selector,UI,logger,element,搭建
来源: https://www.cnblogs.com/yk617558302/p/11328244.html