第一章 Web自动化入门
自动化测试解决的问题:
- 解决回归测试;
- 解决压力测试;
- 解决兼容性测试;
- 提高测试效率,保证产品质量
自动化测试分类:
- web自动化测试
- 移动自动化
- 接口自动化
- 单元测试自动化
什么web项目适合自动化:一般在手工测试后进行
- 需求变动不频繁
- 项目周期长
- 项目需要回归测试
web自动化测试属于黑盒测试
自动化工具:
- QTP:收费
- selenium:免费,开源的web自动化测试,开源,跨平台,支持多浏览器
- robot framework:基于Python可拓展性地关键字驱动的测试自动化
安装selenium:
- python环境搭建
- 安装selenium 命令行中 pip install selenium 查看版本:pip show selenium 卸载:pip uninstall selenium
- 安装浏览器 火狐浏览器48以上,采用selenium3.以上+驱动【要和浏览器版本对应】 火狐48以下不用驱动 驱动下载地址:Releases · mozilla/geckodriver · GitHub 谷歌浏览器 驱动下载地址:
http://chromedriver.storage.googleapis.com/index.html 驱动下载后将驱动所在目录添加到path环境变量中 - 安装浏览器驱动
第二章 Selenium-API操作
初步操作:
#寻包
from time import sleep
from selenium import webdriver
#打开网页
driver=webdriver.Firefox()
#driver=webdriver.Chrome()
#打开网址
driver.get('http://www.baidu.com')
#暂停三秒
sleep(3)
#关闭浏览器
driver.quit()
元素定位:
要想web自动化操作元素,必须找到元素。通过元素的信息或元素层级结果来定位元素
定位元素依赖于:1.标签名 2.属性 3.层级 4.路径
八种定位方式:
- id
- name
- class_name
- tag_name (标签名)
- link_text (定位超链接 a标签)
- partial_link_text (定位超链接 a标签 模糊)
- XPath (元素路径)
- CSS (元素选择器)
id定位案例:通过元素的id属性定位,一般是唯一的
步骤:
- 寻包
- 找到浏览器对象
- 打开需求网址
- 查找元素
- 输入内容
#寻包
from selenium import webdriver
from time import sleep
#找到浏览器对象
driver=webdriver.Firefox()
#打开网址 使用双反斜杠进行转义工作//在绝对路径网址前面加r
driver.get(网址绝对路径)
#查找用户名、密码元素
username=driver.find_element_by_id('userA')
password=driver.find_element_by_id('passwordA')
#send_keys传输内容
username.send_keys('admin')
password.send_keys('123456')
sleep(3)
driver.quit()
name 定位:一般会有重名 class_name定位:一般有多个
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get()
username=driver.find_element_by_name('userA')
password=driver.find_element_by_name('admin')
username.set_keys()
password.set_keys()
sleep()
driver.quit()
tag_name定位:
一般不能精准定位,当有多个相同标签名的,默认定位第一个指定标签名
link_text/paticial_link_text:
link_text:定位元素内容需要全部匹配
driver.find_element_by_link_text().click()
paticial_link_text:定位元素内容可以是模糊,一部分的,但是需要唯一,如果不唯一,那么定位搜索到的第一个
XPath定位:
xml一种标记语言,xpath为xml path
element=driver.find_element_by_xpath(xpath)
定位策略:
- 路径-定位 绝对路径 :以单斜杠开头 如:/html/body/div/p[1]/input 相对路径:以双斜杠开头,双斜杠后边跟元素名,不知元素名称可以用*代替 如://input 建议使用相对路径
- 路径与元素属性结合-定位 所有的属性前都要加@修饰 //input[@id='id属性值']
- 路径与逻辑(多个属性)结合-定位 //input[@id='id属性值' and @name='属性值']
- 路径与层级结合-定位 //input上一级标签名[@id='父级id属性值' ]/input
延伸:
//*[text()="xxx"] 文本内容是xxx的元素
//*[contains(@attribute,'xxx')] 属性中包含xxx的元素
//*[starts-with(@attribute,'xxx')] 属性以xxx开头的元素
CSS定位; 效率比xpath快
element=driver.find_element_by_css_selector(css_selector)
定位策略:
- id选择器 #use 【选择id为use的】
- class选择器 .use 【选择class属性为use的】
- 元素选择器 输入input 【根据元素标签名称选择 】
- 属性选择器 [属性名=‘属性值'] 【所有属性都可以用 】
- 层级选择器 p>input或 p input 【两者区别是p>input为相邻上下两级 p input 不必】
延伸:
属性选择器中:可以寻找部分属性名
[属性名^='开头的字母'] 查找属性名内容为对应开头字母的元素
[属性名$='结束的字母'] 查找属性名内容为对应结束字母的元素
[属性名*='连续包含字母'] 查找属性名内容包含对应字母的元素
p#login_user>input[name='user']
XPath和CSS可以在HTML中右键快速得到结果,但不建议使用
定义一组元素:
driver.find_elements_by_id():输出一组元素,类型为列表或
对列表进行访问或操作需要指定下标或遍历
例:element=driver.find_elements_by_css_selector(#userA);
element[0].send_keys('admin');
用find_element()进行封装:
find_element(By.xxx,'value')
By.xxx:By.ID
By类需要导包:from selenium.webdriver.common.by import By
元素操作:
click() 单击元素
send_keys 输入文本
clear 清除文本
driver.maxmize_window() 最大化浏览器窗口
获取元素信息:
鼠标操作:
from selenium.webdriver.common.action_chains import actionchains
action=actionchains(driver)
action.context_click(driver.find_element_by_ccs_selector("#userA")).perform()
键盘操作:
键盘操作都在keys包里
from selenium.webdriver.common.keys import keys
username=driver.find_element_by_ccs_selector("#userA")
username.send_keys(Keys.BACK_SPACE)
元素等待:
隐式等待:
如果没有找到元素就等待一定时间后再发出警告
driver.implicitly_wait(30)
显式等待: