ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-09 16:55:59  阅读:459  来源: 互联网

标签:info python self driver selector UI logger element 搭建


最近在搭一个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有