------------恢复内容开始------------
大家好。我是小蔡:
看标题就知道这只是一个开篇,没有什么内容。这篇帖子主要内容是想讲发现问题以及UI自动化一些前置知识和一些思想。目前阶段是已经在编写UI自动化框架了,因为我发现我对很多方法不是很熟练和自己一开始制定的思想有所偏差。所以提前做做总结和把思想在理顺一遍。废话不多说。
今天分享的内容有几个方面:
1.什么是UI自动化?
2.关于技术选型以及框架选型
3.关键框架Selenium基础知识
4.总结
1.什么是UI自动化?能给我解决什么问题?
UI自动化是通过工具或者脚本语言将测试过程模拟出来,并重复执行,用以验证功能是否正确的过程。
2.关于技术选型以及框架选型?
市面上Web自动化主流的框架有以下几种:QTP,Selenium,Robot framework(关键字驱动)
Web自动化框架支持语言:VB,Python,Java
测试框架:PyTest,UniTest
2.1最终选型:python+Selenium+Unitest+Log日记+PO模式+数据驱动+HTML自动生成报告
本来选择的是Java+Selenium+Unitest的,因为我本身对Java比较熟悉,又做过Java嘛。语法哪些肯定比较熟悉。后面又抱着玩玩的心态选择了python+Selenium+Unitest,那有人会问了,为什么不选择PyTest,是目前一个主流的测试框架,这个呢,是因为我已经上班了,没有时间去了解这个东西,大致过了一遍,跟UniTest差别不大,多了一个不需要插件就可以实现--数据参数化,当然后续在做到App自动化的时候,我会选择使用PyTest哈。为了方便观察结果会引入日记模块(Log),引入PO模式设计思想,有兴趣可以自己去了解一下。引入自动生成报告的HTML脚本。大概就是这些啦
3.框架基础知识(Selenium基础知识)
3.1安装Selenium
使用pip安装
pip install selenium==默认 #默认为最新版本
PyCharm安装
setting---->选择对项目--->available packages--->输入selenium 选择版本 #建议云弄成国内的。。比较快
3.2浏览器驱动安装:
先确定你电脑的浏览器版本(谷歌/火狐/IE)...
然后去对应的浏览器官网安装驱动
3.3如何定位Web端页面的元素
一共八大定位元素方法:
id,name,class-name,tag-name,Link-name,partial-link-text,Xpath,Css(个人最喜欢一种定位方式,哈哈哈)
我们定位方式做一个类型区分:
id,name,class-name是根据属性(不知道属性的。。。建议回去学校重新学习)
tag-name根据标签
Link-name,partial-link-text是链接定位方式
Xpath是根据元素路径的定位,指哪打哪
Css是一种前端选择器(感谢泉信Web老师,哈哈哈)
3.4各个方法的使用以及演练(前提是:from selenuim import webdriver )
PS:不要问我说为什么使用封装的方法。后面对find方法进行单独个性化封装。所以刚开始的基础全部是by_XX
A)基于id定位:id是为唯一
方法:driver.find_element_by_id(id)
代码:
B)基于name定位:可以多个选择
方法:driver.find_element_by_name(name)
C)基于class_name定位:可以重名和多个命名
方法:driver .find_element_by_claas_name(name)
D) tag_name定位
方法:driver.find_elemeny_by_tag_name(tag_name)
E)partial_Link_test/Link_test定位
方法:driver.element_by_link_test
方法:driver.element_by_partial_link_test
G)Xpath定位
定位策略:1)路径定位 2)路径+属性定位 3)路径+属性+逻辑定位 4)路径+层级+属性定位
方法:driver.find_element_by_Xpath(路径) #路径分为绝对路径和相对路径。。不解释了
扩展:(结合*通配符的使用)
//*[text()=="xx"] #文本内容是XX的元素
//*[contains(@attribute,('xxx))] #属性含有XXX的元素
F)Css定位
定义:利用Css中的选择器来定位元素
方法:driver.find_element_by_css_selector(Css_selector)
Css选择器很多种:列举我常用:id class 元素选择器 属性选择器 层级选择器
id选择器的使用:
1)根据:id选择
2)格式:#元素id
3)例子:#UserA (选择id属性为UserA的元素)
Class选择器的使用:
1)根据:class选择
2)格式:.class
3)例子:.tatal (选择class属性为tatal)
层级选择器的使用:
1)使用:p>input 或者p input 前者是范围是直接直接,后者范围是全部
2)例子:p# p1>input 或者 p[id='p1']>input
Css延伸[了解]:
input[type^='p'] xx属性以p开头
input[type$='p'] xx属性以p结尾
input[type*='d'] xx属性包含d
3.4如何操作Web端页面的元素
输入数据:driver.find_elemenr_by_id("XX").send_keys(“内容”)
模拟点击:driver.find_elemenr_by_id("XX").click()
模拟清空:driver.find_elemenr_by_id("XX").clear()
3.5如何操作浏览器
maximize_window()-------------------浏览器最大化
set_window_size(x,y)-----------------设置浏览器的位置
back()-------------------------------------后腿
forword()----------------------------------前进
refresh()-----------------------------------刷新
close()-------------------------------------关闭当前窗口
quit()----------------------------------------退出
title/current_url---------------------------获取当前页面title/url
3.6获取元素信息后的操作
size 返回大小
text 返回元素文本
get_attribute(“XX”)获取属性值 //一般用于判断元素是否为自己想要的
is_display() 判断元素是否可见
is_enabled() 判断元素是否可用
is_selected() 判断复选框是否被选中
3.7鼠标和键盘的操作
鼠标:
context/double_click(element) 左右键点击
drap_and_drop(elemenr) 拖动
move_to_element(element) 悬停
perform() 执行
使用上上诉方法需要实例化,才可以正常调用方法,和在操作结尾需要使用.perform()结尾
form selenuim.webdriver.conmmon.action_chains import ActionChains
action=ActionChains(driver)
键盘:
需要导入keys类
from selenium.webdiriver.commor.keys import keys
常用输入:
send_keys(keys.BAKE_SPACE)//删除
按住Shift+ATL+send_keys进入底层查看
3.7元素等待
两种类型:
显式等待:针对单个元素
若有该元素则不抛出异常,若超过等待时间就抛出异常
封装在Webdriver类中
隐式等待:只设置一次
driver.implictty_wait(timeout) 一般在前置代码中设置
实现方式:
from selenium.webdriver.suppt.wait import webDriderWait
webDriderWait(driver,timeout,poll_frequncy=频率)
调用until(mothod):直到.....时 mothod:函数名称,一般结合Lambda表达式:Lambda x:x.find_element_by_id("UserA")
结合起来:
element=webDriderWait(driver,timeout,poll_frequncy=频率).until(Lambda x:x.find_element_by_id("UserA"))
3.8CSS定位下拉框 #个人还是比较喜欢元素定位下拉框
使用元素定位
使用selenium特定的方法:<select类>
select_by_index(index) #索引来定位
select_by_value(value) #属性定位
select_by_visible_test(text) #显示文本
3.9强制弹出窗口-----指的是windos自带的窗口
分类:
alter 警告
confirm 确认窗口
prompt 提示
处理方式:
#获取弹窗
alter=switch_to_alert
#调用
alter.text #会给一个返回值。返回弹窗类型
alter.acceptl() #接受,确认
alter.dismiss() #取消
ps:注意只能处理windos自带窗口,注意区分前端提示是div还是windos
3.10Web处理滚动条技术操作
应用场景:元素需要下拉,注册页面需要下拉
观察selenium底层,是提供一种javaScript脚本,让使用者进行调用,从而达到滚动目的
使用方式:
js="windos.scrouTo(左边距,上边距)"
dirver.execute_script(js)
3.11Frame切换
如果不切换Frame/iframe,会使得元素定位不到。ps:不想解释了
方法:
driver.switch_to.frame(frame_refence) #参数是可以填写需要切换 id, name,或者使用元素。这是一个切换的方法
driver.switch_to.default_content() #恢复默认
3.12多窗口切换
明白两个概念,1selenium是自己封装了切换多窗口操作方法2句柄:窗口唯一识别码
稍微解释一下:我们需要通过识别句柄,来判断当前处在哪一个页面
方法:
driver.current_window_handle #获取当前窗口的句柄
driver.window_handles #获取所有窗口的句柄
driver.switch_to.window(句柄) #切换当参数的窗口
这个比较抽象举例子:编了一个实例代码
now_handle=driver.current_window_handle
#获取所有窗口的句柄
handles=driver.window_handles()
for now_handle in handles:
if handle ! = now_handle
driver.switch_to.windos(handle)
3.13截图:
不多逼逼。selenium自带截图方法。
方法:
#唯一方法:使用时间戳。引入time.strftime()
dirver.get_screenshot_as_file(文件路径及文件名称)
3.14扩展:登录方法时候,经常碰到验证码的方法:
常见的方法是:
去掉验证码
使用万能验证码
使用cookie值。伪造cookie值信息(绕过验证码)
补充自动操作cookie方法:
get_cookie(name) #获取指定的cookie
get_cookie() #获取本站cookie
add_cookie(cookie_dict) #添加具体cookie字典
操作步骤大概是:
1.手动登录,2.获取cookie,(抓包获取)3.使用add_cookie添加4.进行刷新操作driver.refresh()
4.总结:
本章是对前置selenium的基础知识进行的总结。后续会有第二章和第三章。第二章是会对Unitest+Log日记+PO模式+数据驱动+HTML自动生成报告这些部分的知识点整理,其实学会了python+selenium已经可以编写自动化脚本,后续篇章是对代码的优化,大概是分为这几个部分,一个是提高代码的健壮性,当页面元素发生变化,在保证业务逻辑的情况正确的情况,不需要修改到逻辑代码,二引入日记是方便编写脚本的定位问题。三自动生成测试报告是方便反馈,所以我引入的一个辣鸡模块。第三章是一个实战的运用,将所学的知识灵活运用。
后续会持续更新App自动化,以及接口测试,接口自动化的总结
敬请期待。
有什么不对地方可以留言指导
------------恢复内容结束------------