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

framework包中文件如下所示:

base_page.py:常用操作方法

在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:浏览器操作方法

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()

logger.py:日志处理

现在,我们来看一下logger.py中是怎么写的,logger需要实现的功能是要指定保存的日志文件路径,日志级别还有调用文件后将日志存入到指定的文件夹中,日志命名格式为当前案例执行时间并精确到秒,可以保证在执行案例过程中精确的打印出当前案例执行过程的日志。代码如下:

 1 #_*_coding:utf-8 _*_
 2 import logging
 3 import os.path
 4 import time
 5
 6 class Logger(object):
 7     def __init__(self,logger):
 8         ‘‘‘指定保存日志的文件路径,日志级别以及调用文件将日志存入到指定的文件中‘‘‘
 9         #创建一个logger
10         self.logger = logging.getLogger(logger)
11         self.logger.setLevel(logging.DEBUG)
12         #创建一个handler,用于写入日志文件
13         rq = time.strftime(‘%Y%m%d%H%M%S‘,time.localtime(time.time()))
14         log_path = os.path.dirname(os.path.abspath(‘.‘))+‘\logs\\‘
15         #如果case组织结构式/testsuit/fraturemoddel/xxx.py,那么得到的相对路径的父路径就是项目的根目录
16         log_name = log_path + rq + ‘.log‘
17         fh = logging.FileHandler(log_name)
18         fh.setLevel(logging.INFO)
19
20         #再创建一个handler,用于输出到控制台
21         ch = logging.StreamHandler()
22         ch.setLevel(logging.INFO)
23         #定义handler的输出格式
24         formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
25         fh.setFormatter(formatter)
26         ch.setFormatter(formatter)
27         #给logger添加handler
28         self.logger.addHandler(fh)
29         self.logger.addHandler(ch)
30     def getlog(self):
31         return self.logger

原文地址:https://www.cnblogs.com/yk617558302/p/11328316.html

时间: 2024-08-28 10:55:13

基于python语言下的UI自动化测试框架搭建(二)的相关文章

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

pycharm工程展示 最近在搭一个UI自动化测试框架,想把整个搭建过程分享出来,如果有不对的地方,希望大家能够指正,首先创建一个名称为,antomation_framework_demo的工程文件, pycharm中工程及文件如下图所示: config:文件中包含调用的浏览器驱动及打开的URL地址 framework: 1.包含定义的页面基类,封装常用的页面操作方法 2.包含打开浏览器操作以及在相对路径下获取浏览器driver 3.日志处理方法 logs:执行日志以时间格式保存在该文件夹下,如

selenium2自动化测试实战--基于Python语言

自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 集成测试是在单元测试的基础上,先通过单元模块组装成系统或子系统,再进行测试.重点是检查模块之间的接口是否正确. 1.1.3 系统测试 系统测试是针对整个产品系统进行的测试,验证系统是否满足需求规格的定义,以及软件系统的正确性和性能等是否满足其需求规格的要求. 1.1.4 验收测试 验收测试是部署软

基于python语言的Selenium自动化测试

  一.Selenium简介 Selenium是一个web自动化应用测试工具,还支持所有的web的管理任务自动化.并且开源免费,也是一个web自动化轻量级框架.它支持多种浏览器.跨平台.跨操作系统.支持多种编程语言编写脚本,还能进行分布式测试用例的执行. Selenium经历三个版本,Selenium1.Selenium2.Selenium3.它不是单独的一个工具,而是由一些类库.插件.工具等组合而成.主要的工具: Selenium IDE:Selenium IDE是嵌入火狐浏览器中的一个插件,

Python+Selenium搭建UI自动化测试框架

Python语言是非常强大的编程语言,很多时候也拿来当脚本语言用. Selenium是web应用测试工具,支持Java.Python等多种语言脚本,支持Chrome.Firefox等多种主流浏览器.主要实现的就是模拟人使用web应用,自动的打开浏览器.打开应用.进入应用进行各种模拟业务操作等等. 接下来,一步一步带领大家实现下Python+Selenium实现使用脚本自动发微博的功能. 1.Python安装 一般Linux系统自带了Python,Windows系统可以参考本人之前文章 [Pyth

关于《selenium2自动测试实战--基于Python语言》

关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至会说,都在扯犊子,看了半天也不知道如何下手. 对于操作手册的书,一般会提供大量的实例,告诉你详细的步骤.对于高手来说,这不就是翻译了一下官方文档嘛,好意思拿来骗钱.但对于新手来说,反而认为是好处,跟着上面的步骤操作就掌握了某种技术能力. 显然,本书属于后者,书中提供了大量代码实例,并没有太多思想层面

简单Web UI 自动化测试框架 pyse

WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动化测试框架. 特点 默认使用CSS定位,同时支持多种定位方法(id\name\class\link_text\xpath\css). 基于Selenium二次封装,使用更简单. 提供脚手架,快速生成自动化测试项目. 自动生成/reports/目录,以及HTML测试报告生成. 自带断言方法,断言tit

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区

数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程.以下是我之前写的一个自动化测试的小Demo.这个Demo基于Selenium与Java.由于现在Selenium在自动化测试的统治地位,并且随着Selenium 4的即将发布,在未来很长的一段时间里这种统治地位应该还会持续,所以我的这篇文章还都是基于Selenium与Java的. 自动化测试小Demo 它要测试的东西其实是要看一下百度搜索能不能返回兴业银行的官网.我们分析一下这段代码都包含些什么东西. 第一,这段代码包

基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的rest服务,通常这些服务要不就是用于手机app的开发,要不就是提供给第三方开发者使用,不管哪种情况,你都需要提供详细的说明给别人,而Swagger就是为这种情况而生的,通过在接口上的注解,生成可供第三方模拟测试和阅读的接口列表,既美观又使用,真是行走江湖之必备良药. [XmPlatform原创,转载的