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

登山则情满于山,观海则意溢于海。这篇文章主要讲述#yyds干货盘点# Selenium Web端自动化从入门到实践相关的知识,希望能为你提供帮助。
一、自动化测试概念 
1、概念

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, 其中RC是Remote Control的缩写
Selenium RC服务器主要包括Seleniumcore,http proxy和 launcher三部分
  • selenium core,是被注入浏览器页面中的js函数集合,用来实现界面元素的识别和操作
  • HTTP Proxy,作为代理服务器修改js的源,以达到“欺骗”被测站点的目的
  • Launcher,用来在启动测试浏览器时完成Selenium core的注入和浏览器代理的设置
 
 
3、Selenium 2. 0的工作原理
 
 
 
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安装
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架构
四、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
  • 如果不能科学上网,推荐使用国内镜像:? ??https://npm.taobao.org/mirrors/chromedriver/??
  • 配置driver的环境变量
 
五、元素定位基础知识

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

1、HTML
          < html> < /html> :
                      文档的根元素,所有的描述都在这里
          < head> < /head> :     
                      文档头信息,包含< title> < /title> 、< script> < /script> 、< style> < /style> 标签
          < body> < /body> : 
                      文档正文,其信息会在浏览器中显示
                      可以包含文本标签,链接,图像标签,表格标签,框架标签等
2、Dom
                  一个页面是通过DOM构造、布局以及绘制页面三步完成

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

4、元素定位的重要性
  • 自动化测试的根本:准确的操作测试对象(元素)

  • 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                                                文本内容
【#yyds干货盘点# Selenium Web端自动化从入门到实践】 
十、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页的操作这些元素的方法
     
 
 
十五、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-ordering插件??来强制指定用例执行顺序 pip install pytest-ordering
                            语法:@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.

    推荐阅读