加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:43:39 所属栏目:Python 来源:网络整理
导读:最近在搭一个UI自动化测试框架,想把整个搭建过程分享出来,如果有不对的地方,希望大家能够指正,首先创建一个名称为,antomation_framework_demo的工程文件, pycharm中工程及文件如下图所示: config:文件中包含调用的浏览器驱动及打开的URL地址 framewor

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读