web自动化测试-------selenium
引入web自动化测试的目的:通过运行脚本,让程序自动地检测项目代码是否符合需求以及逻辑的正确性前提:项目需求不经常变化,需要进行回归测试等
目录索引:
主流工具软件 selenium-WebDriver 元素定位 元素操作 元素等待 下拉框 警告框 滚动条 frame表单切换 多窗口 窗口截图 验证码处理
主流工具软件:
Web自动化测试:selenium
App端自动化测试:Appium、UIautomation
接口自动化测试:Jmeter、Postman
性能测试:Jmeter、LoadRunner
^_^注意:Chrome浏览器拖拽使用插件要控制版本在66以下
selenium-WebDriver
安装
pip install selenium
谷歌浏览器
selenium2.x/3.x +Chrome驱动
各个驱动下载地址
元素定位
为什么要学习元素定位? 因为自动化测试需要书写脚本,让程序代码自动定位/操作指定元素 WebDriver提供了八种元素定位方式,分别是:
1. id
2. name
3. class_name
4. tag_name
5. link_text
6. partial_link_text
7. Xpath
8. Css
id定位实现 步骤分析
from selenium
import webdriver
from time
import sleep
"""
初次实例化浏览器步骤需要告知 chromedriver 在Chrome中的路径,如
driver = webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver')
"""
driver
=webdriver
.Chrome
()
url
='xxx'
driver
.get
(url
)
driver
.find_element_by_id
("id名")
.send_keys
("admin")
sleep
(3)
quit
()
id定位 总结
1. 导包
2. url中\\转义
3. id定位方法
3. 发送内容方法
4. 暂停方法
5. 关闭浏览器
(其他元素定位方式参考id定位)
提示:find_element和find_elements的区别
find_element
对于find_element()的使用,他需要传入2个参数,查找方式by和值,如find_element_by_id("name"),
但是find_element()只会查找页面中符合条件的第一个节点,并返回
find_elements
find_elements查找返回的是一个list列表对象。所以查找多个节点时,应该使用find_elements()更好
但是当只是想要获取标签内的内容时,使用find_element,因为列表对象没有相应的获取方法
元素定位Xpath
from selenium
import webdriver
driver
.find_element_by_xpath
("Xpath路径")
Xpath下载地址
Xpath定位元素的几种方式:
1. 路径-定位
1). 绝对路径
2). 相对路径
2. 利用元素属性-定位
3. 层级与属性结合-定位
4. 属性与逻辑结合-定位
绝对路径:从最外层元素到指定元素之间所有经过元素层级路径 ;如:/html/body/div/p[2]
相对路径:从第一个符合条件元素开始(一般配合属性来区分);如://input[@id='kw']
元素属性
示例://*[@id='userA']
层级与属性结合
说明:要找的元素没有属性,但是它的父级有;
示例://*[@id='p1']/input
属性与逻辑结合
说明:解决元素之间个相同属性重名问题
示例://*[@id='telA' and @class='telA']
//*[text()="xxx"] 文本内容是xxx的元素
//*[starts-with(@attribute,'xxx')] 属性以xxx开头的元素
//*[contains(@attribute,'Sxxx')] 属性中含有xxx的元素
最简单的通过Xpath获取方式就是找到元素对应的标签,右键copy---->copy Xpath导出Xpath路径
元素定位CSS同Xpath
元素操作
好了,那么通过元素定位获取了对应的元素,可以通过以下方法对元素进行操作
元素常用操作方法
1. clear() 清除文本
2. send_keys() 模拟输入
3. click() 单击元素
driver
.find_element_by_id
('').clear
()
WebDriver操作浏览器常用方法
1. maximize_window() 最大化 --> 模拟浏览器最大化按钮
2. set_window_size(100,100) 浏览器大小 --> 设置浏览器宽、高(像素点)
3. set_window_position(300,200) 浏览器位置 --> 设置浏览器位置
4. back() 后退 --> 模拟浏览器后退按钮
5. forward() 前进 --> 模拟浏览器前进按钮
6. refresh() 刷新 --> 模拟浏览器F5刷新
7. close() 关闭 --> 模拟浏览器关闭按钮(关闭单个窗口)
8. quit() 关闭 --> 关闭所有WebDriver启动的窗口
WebDriver其他常用方法
1. size 返回元素大小
2. text 获取元素的文本
3. title 获取页面title
4. current_url 获取当前页面URL
5. get_attribute("xxx") 获取属性值;xxx:要获取的属性
6. is_display() 判断元素是否可见
7. is_enabled() 判断元素是否可用
提示:
1. size、text、title、current_url:为属性,调用时无括号;如:xxx.size
2. title、current_url:使用浏览器实例化对象直接调用; 如: driver.title
size
=driver
.find_element_by_id
("userA").size
print('size:',size
)
href
=driver
.find_element_by_id
("fwA").get_attribute
("href")
模拟键鼠操作
WebDriver库将操作鼠标的方法封装在ActionChains类中,对键盘的操作都封装在Keys类中
鼠标操作
1. context_click() 右击 --> 此方法模拟鼠标右键点击效果
2. double_click() 双击 --> 此方法模拟双标双击效果
3. drag_and_drop() 拖动 --> 此方法模拟双标拖动效果
4. move_to_element() 悬停 --> 此方法模拟鼠标悬停效果
5. perform() 执行 --> 此方法用来执行以上所有鼠标方法
from selenium
.webdriver
.common
.action_chains
import ActionChains
Action
=ActionChains
(driver
)
element
=Action
.context_click
(username
)
element
.perform
()
"""
3、4合并为:
Action.context_click(username).perform()
"""
键盘操作
from selenium
.webdriver
.common
.keys
import Keys
1. send_keys(Keys.BACK_SPACE)删除键(BackSpace)
2. send_keys(Keys.SPACE)空格键(Space)
3. send_keys(Keys.TAB)制表键(Tab)
4. send_keys(Keys.ESCAPE)回退键(Esc)
5. send_keys(Keys.ENTER)回车键(Enter)
6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
7. send_keys(Keys.CONTROL,'c')复制(Ctrl+C)
element
=driver
.find_element_by_id
("userA")
element
.send_keys
("admin1")
element
.send_keys
(Keys
.BACK_SPACE
)
element
.send_keys
(Keys
.CONTROL
,'a')
element
.send_keys
(Keys
.CONTROL
,'c')
driver
.find_element_by_id
('passwordA').send_keys
(Keys
.CONTROL
,'v')
元素等待
显式等待隐式等待
隐式等待
说明:等待元素加载指定的时长,超出抛出NoSuchElementException异常,实际工作中,一般都使用隐式等待;
显式与隐式区别:
1. 作用域:显式等待为单个元素有效,隐式为全局元素
2. 方法:显式等待方法封装在WebDriverWait类中,而隐式等待则直接通过浏览器实例化对象调用
隐式等待调用方法
调用:
driver.implicitly_wait(10)
(driver:为浏览器实例化对象名称) (10为等待最大时长,单位:秒)
说明:
如果定位某一元素定位失败,那么就会触发隐式等待有效时长,如果在指定时长内加载完毕,则继续执行,否则
抛出NoSuchElementException异常,如果元素在第一次就定位到则不会触发隐式等待时长;
下拉框
下拉框就是HTML中<select>元素,通过option选项的值来定位
方法:通过select类中的方法:
1. select_by_index() --> 根据option索引来定位,从0开始
2. select_by_value() --> 根据option属性 value值来定位
3. select_by_visible_text() --> 根据option显示文本来定位
代码实现步骤:
from selenium
.webdriver
.support
.select
import Select
select
=Select
(driver
.find_element_by_id
('selectA'))
select
.select_by_index
(下标
)
select
.select_by_value
('option内标签value值')
select
.select_by_visible_text
('option对应的文本内容,如111111')
警告框
警告框处理办法:
1. text --> 返回alert/confirm/prompt中的文字信息
2. accept() --> 接受对话框选项
3. dismiss() --> 取消对话框选项
实际步骤:
driver
.find_element_by_id
("alerta").click
()
alert
=driver
.switch_to
.alert
print(alert
.text
)
alert
.accept
()
滚动条
场景:页面注册同意条款,需要滚动条到最底层,才能点击同意。
在HTML页面中,页面元素为动态显示,元素根据滚动条的下拉而被加载。
案例:
案例:打开页面A,
2秒后,下拉页面到最底层
import time
from selenium
import webdriver
driver
=webdriver
.Chrome
()
url
='xxx'
driver
.get
(url
)
time
.sleep
(2)
js1
="window.scrollTo(0,1000)"
driver
.execute_script
(js1
)
frame表单切换
frame表单切换是什么?
场景--母页面(A)中有2个内嵌子页面(B)和(C),通过打开母页面A切换到子页面B和C,然后操作B和C中的属性
方法:
1). driver.switch_to.frame("myframe1") --> 切换表单方法
(myframe1:为frame表单的name或id)
2). driver.switch_to.default_content() --> 恢复默认页面方法
(在frame表单中操作其他页面,必须先回到默认页面,才能进一步操作)
3). driver.switch_to.parent_frame() -->向上的单层切换
操作原理:
1) html中的iframe标签提供了内联结构,使用内联结构可以在一个浏览器窗口显示多个页面。
2) iframe标签是外层页面的标签,若想操作iframe框架内嵌的页面,需要先定位到iframe标签上。
3) 通过switch_to.frame()切换到内层页面,再进行内层页面的操作。
4) 内层页面的操作办法和普通页面的操作办法相同:元素定位、元素操作。
图例
多窗口
场景:在打开的A页面新打开B页面,操作B页面中的元素
方法
方法:
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
句柄
窗口截图
frame说明:自动化脚本是由程序去执行的,因此有时候打印的错误信息并不是十分明确。如果在执行出错的时候对当前 窗口截图保存,那么通过图片就可以非常直观地看到出错的原因。
方法
方法:
直接调用即可
1). get_screenshot_as_file(imgpath) --> 截取当前窗口
(imgpath:图片保存路径)
验证码处理
验证码处理方式:
1).关闭验证码验证(简单粗暴)
2).设置万能验证码(简单粗暴)
3).记录cookie
4).验证码识别(不推荐)
方法:
1. get_cookie(name) --> 获取指定cookie
(name:为健名)
2. get_cookies() --> 获取本网站所有本地cookies
3. add_cookie(str) --> 添加cookie
(str:为python中的字典格式)
结束
句柄:英文handle,窗口的唯一识别码 ↩︎