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

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

  1. python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

    Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...

  2. python语法元素测试_基于python全局设置id 自动化测试元素定位过程解析

    背景: 在自动化化测试过程中,不方便准确获取页面的元素,或者在重构过程中方法修改造成元素层级改变,因此通过设置id准备定位. 一.python准备工作: 功能:用自动化的方式进行批量处理. 比如,你想 ...

  3. 基于python的智能家居_基于Python的智能家居自动化测试脚本设计及实现

    投稿网址 http:www.VideoE.cn|<电视技术>第39 卷第5 期(总第458 期) 117 [本文献信息]沈杰,潘科,刘昕,等. 基于 Python 的智能家居自动化测试 ...

  4. python生成json接口_基于python的Flask框架写json接口并且结合eolinker进行接口测试

    一.前言 很多时候为了提高软件开发的效率,后端程序人员理想状态下应该编写程序测试接口供前端程序人员进行测试,以便前端的开发.笔者由于项目的需求近期尝试学习了一下测试接口的编写,以Python+Flas ...

  5. python数据接口设计_基于python的接口测试框架设计(一)连接数据库

    基于python的接口测试框架设计(一)连接数据库 首先是连接数据库的操作,最好是单独写在一个模块里, 然后便于方便的调用,基于把connection连接放在__init__()方法里 然后分别定义D ...

  6. python 无头浏览器多线程_基于Python, Selenium, Phantomjs无头浏览器访问页面

    引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...

  7. python 工资管理软件_基于[Python]的员工管理系统

    基于[Python]的员工管理系统 -------------------------------- 简介 使用python语言来完成一个员工管理系统,员工信息包含:员工工号,姓名, 年龄,性别,职位 ...

  8. python实现实时监控_基于 Python 的交换机实时监控系统的设计与实现

    从高校校园网运维工作实际出发,论文提出了一种基于 Python 语言+SNMP协议的网络交换机监测系统设计思路与实现方法.整个系统系统采用B/S模式,基于轻量级的web开发框架web.py实现.后端采 ...

  9. python人脸识别库_基于Python的face_recognition库实现人脸识别

    Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...

  10. python多叉树遍历_基于Python的多叉树遍历算法

    [ 综直厘翹 S 赛理 ) 信息记录材料 2019 年 5 月第 20 卷第 5 期 基于 Python 的多叉树遍历算法 钱雨波 , 王金祥 ( 指导老师 ) ( 延边大学 吉林 延边 1 3300 ...

最新文章

  1. TCP/IP 计算机网络协议
  2. Eclipse无法打开“Failed to load the JNI shared library”
  3. java lamda循环条件_Java lambda 循环累加求和代码
  4. 软件工程(可行性研究讲解)
  5. linux文件及文件夹权限
  6. 生产者-消费者模型之集合ArrayBlockingQueue源码解读
  7. Android控件 TabHost,Android控件之TabHost用法实例分析
  8. 字母数字下划线常用正则表达式
  9. 机器学习实战(一):K-近邻算法(史上最全干货) 算法总结+案例实战
  10. python 文件格式转换_如何把txt文件转换成py文件
  11. 全网首发 nuScenes数据集(百度网盘 + 迅雷网盘) + 下载方法
  12. 合泰单片机点灯c语言程序,ht66f018合泰单片机暖风机的C语言源程序
  13. windows如何截屏
  14. 用python wxpy管理微信公众号,并利用微信获取自己的开源数据。
  15. 计算机大学四年该如何努力学习?
  16. 阿里云ECS最新的实例规格族有哪些
  17. 【JokerのZYNQ7020】SDK程序从QSPI启动。
  18. 大学四年如何规划之出国留学
  19. 17.文件系统磁盘配额
  20. 11. 前端基础--CSS盒子定位

热门文章

  1. SAP Spartacus里使用Observable访问Component数据
  2. 如何将bing搜索页面以HTML Mashup的方式嵌入到SAP C4C页面
  3. 利用ES6的Generator语法实现自定义iterator
  4. SAP云平台部署应用时遇到的502 Updating service failed - Bad Gateway
  5. 一个好用的markdown表格生成工具
  6. SAP IBASE Category 01和03的区别
  7. 如何修改来自ERP 系统的product category
  8. SAP ABAP实用技巧介绍系列之使用代码获得某个structure上的扩展字段
  9. Batch request processing in backend
  10. SAP S/4HANA里的生产订单,标识其已经结束生产可以发货的字段