一、自动化测试概念

 

1、概念

#yyds干货盘点# Selenium Web端自动化从入门到实践_python

java:TestNg

python:unittest  pytest

2、自动化测试可行性

  •   测试目的明确,需求不会频繁的变更

 

  •   对于项目的自动化测试,要看项目的具体情况

 

  •   一个产品需要在多个环境下部署
  • 对于web GUI测试,需要测试用例在不同的浏览器上进行兼容性测试
  • 移动端测试,同样的测试用例需要在多个不同的android和ios执行
  • 对于一些企业级软件,不同的企业他需要按照对应的行业领域做定制化,但是各个定制版本的主题功能绝大多数是一致的,只是个别功能有轻微的差异
  • 测试人员具备一定编程能力

 

二、selenium核心原理与机制

 

1、代码分析

   需求:

(1)打开Chrome浏览器,在地址栏中输入百度的网址。

(2)在搜索输入框中输入关键词“自动化测试”并按Enter键。

(3)验证搜索结果页面的标题是否是“自动化测试_百度搜索”。

注意:把dirver放到本地的文件夹后,一定要配置到环境变量中

2、Selenium 1. 0的工作原理

Selenium 1. 0,又称SeleniumRC, 其中RCRemote Control的缩写

Selenium RC服务器主要包括Seleniumcore,http proxy和 launcher三部分

  • selenium core,是被注入浏览器页面中的js函数集合,用来实现界面元素的识别和操作
  • HTTP Proxy,作为代理服务器修改js的源,以达到“欺骗”被测站点的目的
  • Launcher,用来在启动测试浏览器时完成Selenium core的注入和浏览器代理的设置

 #yyds干货盘点# Selenium Web端自动化从入门到实践_python_02

 

3、Selenium 2. 0的工作原理

 

 #yyds干货盘点# Selenium Web端自动化从入门到实践_python_03

 

4、Selenium 3. 0的工作原理 2016

  • 3. 0版本的API向下兼容2. 0
  • JDK 环境需要升级到JDK 1.8或者以上。
  • 移除了1. 0版本的RC,也就是说,Selenium 1. 0不再得到官方的支持。
  • 2. 0版本的Firefox(不需要单独下载驱动)3. 0官方提供了一个geckodriver,具体用法类似于 ChromeDriver.
  • 官方开始支持微软的(Edge)浏览器,但是需要下载对应的 Driver(Microsoft Web Driver.exe).
  • 官方支持的最低版本为(IE9)

 

三、selenium安装

#yyds干货盘点# Selenium Web端自动化从入门到实践_python_04

1、Selenium WebDriver

      客户端API接口,测试人员通过调用这些接口(WebDriver源码),来访问浏览器驱动,浏览器驱动再访问浏览器

2、Selenium IDE

官网地址:https://www.selenium.dev/

Selenium IDE是一个浏览器插件,支持chrome浏览器和Firefox浏览器,可以将手动测试过程记录下来,并生成自动化测试脚本,可以实现回放。

使用方法

作用:以录屏的方式帮助异地开发重现bug

3、Selenim Grid

1)可以解决什么问题?

  • 当web应用需要进行不同浏览器的兼容性测试时,首先需要准备很多机器或者模拟

机,并安装所需的不同测览器。

  • 当web应用需要进行同一浏览器的不同版本的兼容性测试时,同样需要准备很多安装了同一浏览器的不同版本的测试执行机器
  • 在GUI自动化测试用例的数量比较多的情况下,你不希望只用一台测试执行机器以串行的方式执行测试用例,而希望可以用上所有可用的测试执行机器,以并发的方式执行测试用例

2)Selenium Grid架构

#yyds干货盘点# Selenium Web端自动化从入门到实践_自动化测试_05

四、Selenium开发环境搭建

1、安装python

     https://www.python.org/官网下载python

2、安装pycharm

           https://www.jetbrains.com/pycharm/download/#section=windows (使用社区版即可)

3、安装selenium

  • 离线安装

               下载指定的selenium版本;​https://pypi.org/project/selenium/

               解压文件;

               使用cmd进入解压目录下执行命令:python ​setup.py​ install   

  • 使用pip在线安装:     

               pip installselenium

               pip installselenium==指定版本号 如:pip install selenium==2.48.0

4、下载driver

 

五、元素定位基础知识


<html>
<head>
.......
</head>
<body>
.......
</body>
</html>

1、HTML

      <html></html> :

            文档的根元素,所有的描述都在这里

      <head></head> :   

            文档头信息,包含<title></title>、<script></script>、<style></style>标签

      <body></body> : 

            文档正文,其信息会在浏览器中显示

            可以包含文本标签,链接,图像标签,表格标签,框架标签等

2、Dom

          一个页面是通过DOM构造、布局以及绘制页面三步完成

#yyds干货盘点# Selenium Web端自动化从入门到实践_python_06

3、XML

  • 什么是XML

                  XML指可扩展标记语言,与HTML类似,HTML最多是用来展示数据的,但是XML是为了

               传输和存储数据而非显示数据

  • 什么是XPath

                 XPath是在XML文档中查找信息的一种语言,Xpath可以用来在XML文档中对元素和属性

              进行遍历

                 虽然XPath是用来查找XML节点,但同样可以查找HTML文档中的节点,因为HTML和XML

             结构类似

  • Xpath介绍//*[@id="su"]

            以//*[@id="su"]为例(百度一下按钮)

/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input

#yyds干货盘点# Selenium Web端自动化从入门到实践_自动化测试_07

4、元素定位的重要性

  • 自动化测试的根本:准确的操作测试对象(元素)

#yyds干货盘点# Selenium Web端自动化从入门到实践_自动化测试_08

  • indElement和findElements方法

findElement()返回一个WebElement元素 findElements() 返回一个List,多个WebElement元素

 

六、Selenium实现元素定位

Selenium提供了定位元素的API,这些方法都被定义在WebDriver类中,这些方法都以find开头

  • find_element_by_id       通过id定位元素
  • find_element_by_name     通过控件名称定位
  • find_element_by_tag_name  通过标签名称定位
  • find_element_by_class_name   通过类名定位
  • find_element_by_link_text        通过链接文本定位
  • find_element_by_partial_link_text   通过部分链接文本定位
  • find_element_by_xpath  通过xpath定位元素   通过xpath定位元素
  • find_element_by_css_selector  通过css选择器

 

七、Selenium WebDriver属性

  • driver.name      浏览器名称
  • driver.current_url          当前url
  • driver.title       当前页面标题
  • driver.page_source     当前页面源码
  • driver.current_window_handle  窗口句柄
  • driver.window_handles     当前窗口所有句柄

 

 

八、Selenium WebDriver方法

  • driver.back()                    浏览器后退
  • driver.forward()                浏览器前进
  • driver.refresh()                 浏览器刷新
  • driver.close()                    关闭当前窗口
  • driver.quit()                       退出浏览器
  • driver.switch_to.window   切换窗口
  • driver.switch_to.frame      切换到frame
  • driver.switch_to.alert         切换到alert
  • driver.switch_to.active_element       切换到活动元素

 

九、Selenium WebElement属性

  • id                          ID
  • size                       宽高
  • rect                        宽高和坐标
  • tag_name              标签名称
  • text                         文本内容

 

十、Selenium WebElement方法

  • send_keys()                         输入内容
  • clear()                                 清空内容
  • click()                                  单击
  • get_attribute()                     获得属性值
  • is_selected()                        是否被选中
  • is_enabled()                         是否可用
  • is_displayed()                       是否显示
  • value_of_css_property()        css属性值

 

十一、Selenium操作下拉列表

  • select_by_value() 根据值选择
  • select_by_index()              根据索引选择
  • select_by_visible_text       根据文本选择
  • deselect_by_value            根据值反选
  • deselect_by_index            根据索引反选
  • deselect_by_visible_text   根据文本反选
  • deselect_all                       反选所有
  • options                               所有选项
  • all_selected_options          所有选中选项
  • first_selected_options        第一个选择选项

 

十二、Selenium鼠标和键盘操作

  • click(on_element=None)                          单击鼠标左键
  • click_and_hold(on_element=None)         点击鼠标左键,不松开
  • context_click(on_element=None)            点击鼠标右键
  • double_click(on_element=None)            双击鼠标左键
  • drag_and_drop(source,target)                  拖拽到某个元素然后松开
  • darg_and_drop_by_offset(source,xoffset,yoffset)   拖拽到某个坐标然后松开
  • move_by_offset(xoffset,yoffset)         鼠标从当前位置移动到某个坐标
  • move_to_element(to_element)    鼠标移动到某个元素
  • move_to_element_with_offset(to_element,xoffset,yoffset)  移动到距某个元素(左上角坐标)多少距离的位置
  • perform()    执行所有操作

 

十三、元素等待

  • 强制等待                  sleep()
  • 隐式等待                  implicitly_wait(20)
  • 显示等待                 

title_is             判断title是否出现

title_contains       判断title是否包含某些字符

presence_of_element_located  判断某个元素是否被加到了dom树里,并不代表该元素一定可见

visibility_of_element_located 判断某个元素是否被加到了dom树里并且可见,宽和高都大于0 visibility_of 判断元素是否可见,如果可见就返回这个元素

presence_of_all_elements_located 判断是否至少有1个元素存在于dom树中

visibility_of_any_elements_located 判断是否至少有1个元素在页面中可见

text_to_be_present_in_element    判断指定的元素中是否包含了预期的字符串

text_to_be_present_in_element_value 判断指定元素的属性值中是否包含了预期的字符串

frame_to_be_avaliable_and_switch_to_it 判断该frame是否可以switch进去

element_to_be_clickable 判断某个元素是否可见并且是可点击的

element_to_be_selected 判断某个元素是否被选中了,一般用在下拉列表

alert_is_present 判断页面上是否存在alert

 

十四、验证码的处理

1、验证码在自动化测试过程中如何处理

  • 找开发屏蔽
  • 找开发置为默认
  • 使用pytesseract和Pillow实现验证码识别

使用pytesseract模块和Pillow模块解决 安装pytesseract模块      pip3  install pytesseract 安装Pillow      pip3  install  Pillow

2、网站验证码解决思路

  • 截屏整个页面
  • 获得验证码坐标数据
  • 根据坐标数据抠图
  • 使用pytesseract模块进行验证

 

3、POM模式 Page Object Model

  • 在POM下,被测项目的每一个页面都有一个对应的page class
  • 每一个page class维护着该web页的元素定位集和
  • 每一个page class维护着该web页的操作这些元素的方法

   #yyds干货盘点# Selenium Web端自动化从入门到实践_python_09

 

 

十五、Pytest框架

1 、介绍:

       pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高

2、 特点:

  • 容易上手,入门简单,文档丰富
  • 能够支持简单的单元测试和复杂的功能测试
  • 支持参数化parametrize
  • 强大的fixture自定义功能,这个是框架的核心亮点功能。

 

3、安装:pip install pytest

 

4、运行规则:

     查找当前目录及其子目录下以test*.py或者*test.py的python文件

     找到文件后,在文件中找到以test开头函数和方法并执行

 

5、编写规则:

  • 测试文件以test开头(以test结尾也可以)
  • 测试类以test开头,并且不能带有init方法
  • 测试函数以test开头
  • 断言使用基本的assert

6、pytest 参数化处理

  • 在pytest中也可以使用参数化测试,即每组参数都独立执行一次测试
  • pytest.mark.parametrize(argnames,argvalues)

7、fixture

  • 定义fixture和定义普通函数差不多,唯一区别是在函数上加个装饰器@pytest.fixture()
  • fixture命名不要以test开头,跟用例区分开,fixture是有返回值的,没有返回值默认为none
  • 用例调用fixture的返回值,直接把fixture的函数名称当作变量名称

8、使用pytest重构项目

  • 将__init__修改为setup_class
  • 修改为python断言assert,(pytest用的就是python里面的断言)
  • 使用pytest依赖插件(解决用例之间的依赖关系)pip install pytest-dependency

 

               语法:@pytest.mark.run(order=xx)值越小, 优先级越高  0 1

9、pytest用例执行顺序

  • 文件名称 按 ASCII 码排序
  • 文件内部按代码先后顺序排序

十六、日志

1、日志的作用

  • 程序调试
  • 故障分析与问题定位
  • 用户行为分析

2、日志的级别

  • DEBUG 最详细的日志信息
  • INFO 信息详细程序仅次于DEBUG,通常只记录关键点信息
  • WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间低)
  • ERROR 由于一个更严重错误导致某些功能不能正常运行时记录的信息
  • CRITICAL  当发生严重错误,导致应用程序不能继续运行时记录的信息

3、四大组件

组件名称     对应类名          功能描述

日志器         Logger             提供了应用程序可一直使用的接口

处理器         Handler            将logger创建的日志记录发送给合适的输出

过滤器         Filter                提供了更细粒度的控制工具来决定输出哪条日志,丢弃哪条日志

格式器         Formatter         决定日志记录的最终输出格式


import logging
import logging.handlers
import datetime

def get_logger():
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)


rf_handler = logging.handlers.TimedRotatingFileHandler('all.log',when='midnight', interval=1, backupCount=7,atTime=datetime.time(0, 0, 0, 0))
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s -%(message)s"))

f_handler = logging.FileHandler('error.log')
f_handler.setLevel(logging.ERROR)

f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s -%(filename)s[:%(lineno)d] - %(message)s"))

logger.addHandler(rf_handler)

logger.addHandler(f_handler)

return logger

十七、allure生成报告

https://dl.bintray.com/qameta/generic/io/qameta/allure/allure/2.7.0/

下载好后,将bin目录配置环境变量。比如:C:\allure\allure-2.7.0\allure-2.7.0\bin

  • 注意生成测试报告,必须在命令行执行

pytest --alluredir ./reporttestxx.py ------在框架目录“reports”下生成report文件

allure serve ./reports -------启动allure查看报告