目录
(by=By.ID,value='id 值') —— html元素标签中的id属性
(by=By.NAME,value='属性name的值') —— html元素标签中的name属性
(by=By.TAG_NAME,value='标签名') —— html元素标签名称
(by=By.CLASS_NAME,value='属性class的值') —— html元素标签中的class属性
(by=By.LINK_TEXT,value='链接处的显示文本') —— html元素标签中的页面显示的链接文本内容
(by=By.PARTIAL_LINK_TEXT,value='链接处的显示文本(的局部)—— 模糊匹配
(By.CSS_SELECTOR,'选择器(组合)') —— 与css样式表的选择器相似的使用方法
通过元素的路径定位元素 ———— 元素1> 元素2 >...
1、首先需要理解web自动化测试以及基于selenium的web自动化测试
2、掌握python版的selenium+webdriver自动化测试的基本方法
3、了解pytest自动化框架基本机构
关于自动化测试:是通过程序代码,模拟重复人工之前的操作进行的测试,操作被测软件,检查软件的处理结果是否正确,它的特点是:前期的开发/修改的成本高,但后期的运行成本低。接入的策略是无法通过人力来实施,重复性执行次数高,故考虑时间周期,一般需要选择性的开展自动化,不是全部开展进行的;此功能+界面已经稳定,不再进行变更,且没有新的bug,在此前提下,重复性执行次数高,通常重复执行次数在5~10+次。
一般的适用场景在(回归用的)冒烟测试、回归测试自动化、性能测试
Web自动化测试
有程序(脚本)模拟人在web UI 界面上的操作和验证结果,基于GUI自动化
常用的开发工具(模块/包)selenium
app、接口 自动化
Selenium的安装
开源,跨平台,https://www.selenium.dev/
支持多种编程语言(js、python、java……),支持多浏览器
- selenium工具包的(在线)安装:
python中独立的第三方工具包
pip install selenium,如果提示pip无法识别,需要确认path环境变量中,是否有配置...\python; ...\python\Scripts
例如:...\python3.7.1\; ...\python3.7.1\Scripts\
- 浏览器的驱动安装,不同浏览器的渠道,由各官方浏览器各自实现
pip install selenium 这是打开CMD通过国外网站下载,相对速度较慢
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium 这是打开CMD通过国内清华网站上下载,相对速度较快
若以上命令下载文件,显示不存在,则可通过echo %Path%先查找到python的文件安装是否存在,若不存在,则需先安装python然后再通过网站下载
下载完成后,可通过下图查询更新版本的chrome 版本号、firefox版本号
其他浏览器驱动:
地址:http://developer.microsoft.com/en-us/microsoft.-edge/tools/webdriver/
注意:浏览器与下载的浏览器驱动版本必须匹配,所以要关闭浏览器的紫红更新选项,如:Firfox默认是开启的,以防止一段时间后,驱动器版本不匹配
根据chrome版本选择(最近的)驱动下载,进入下载(如图)的操作,下载地址:
- chrome: http://npm.taobao.org/mirrors/chromedriver/
- firefox:http://npm.taobao.org/mirrors/geckodriver/
下载完成后,将下载的chromedriver.exe文件放在python安装目录下,通过CMD进入python,输入from selenium import webdriver——回车,输入browser = webdriver.Chrome()——回车,查看是否可调出弹窗;
说明:Selenium 工具包是要通过浏览器驱动软件,才能启动对应的浏览器,从而完成后续的网站访问操作的自动化
浏览器UI 测试基础代码
from selenium import webdriver # 引入selenium.webdriver包
browser = webdriver.Chrome() # 创建浏览器对象,注:必须已下载对应的浏览器驱动
# browser = webdriver.Firefox()
# browser = webdriver.Edge()
browser.get('http://www.baidu.com') # 打开URL页面
browser.quit() # 关闭浏览器,退出
WebDriver框架
- 框架:(第三方开发出来的)一组相互配合协作的(工具)类——我们可以直接使用其中的类及其方法,访问软件/硬件
- WebDriver 的使用:
from selenium import webdriver # 引入selenium.webdriver包 # webdriver是指web的驱动器 from selenium.webdriver.common.by import By browser = webdriver.Chrome() # 创建(谷歌)浏览器对象,注:必须已下载对应的浏览器驱动 # browser = webdriver.Firefox() #火狐浏览器 # browser = webdriver.Edge() #Edge浏览器 br.get('具体网址') ys_x = br.find_element(by=By.value)
- 创建浏览器对象》启动、操作、关闭浏览器
- (通过对象)启动浏览器,并打开页面 ——
browser.get('http://URL......') #视情况最大化浏览器窗口 browser.maximize_window() #例题:导入文件 from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://172.30.209.172/Web_form.htm') #跳转网页链接的页面路径 browser.quit() #结束语
- (通过对象)关闭浏览器 ——
browser.quit()
W3School TIY Editorhttps://www.w3school.com.cn/tiy/t.asp?f=eg_html_doctype
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
</head>
<body>
<from cation='./.0.html'method='Get'>
电话号码:<input type='text'id='id01'name='dian hua'/>
<input type='submit'name='ti_jiao' value='提交'/>
</from>
</body>
</html>
Web页面中元素的定位及操作
-
selenium中常用的元素定位方法——8种:
- selenium通过UI 元素的特征,识别、定位需要操作的目标元素后,再模拟人工进行操作
- 引用定位类By:
- from selenium.webdriver.common.by import By
- elX = browser.find_element(By.元素定位特征,'特征的值') ——返回页面上符合特征的第一个元素
- els = browser.find_elements(By.元素定位特征,'特征的值') ——返回页面上所有符合特征的元素,组合一个列表
- (By.CSS_SELECTOR,'选择器(组合)')
-
(by=By.ID,value='id 值') —— html元素标签中的id属性
el_x = browser.find_element(by=By.ID,value='id01')
-
(by=By.NAME,value='属性name的值') —— html元素标签中的name属性
el_x = browser.find_element(by=By.NAME,value='pwd')
-
(by=By.TAG_NAME,value='标签名') —— html元素标签名称
el_s = browser.find_elements(by=By.TAG_NAME,value='input') el_x = el_s[4]
-
(by=By.CLASS_NAME,value='属性class的值') —— html元素标签中的class属性
el_s = browser.find_elements(by=By.CLASS_NAME,value='小清新') el_x = ys_s[0]
-
(by=By.LINK_TEXT,value='链接处的显示文本') —— html<a>元素标签中的页面显示的链接文本内容
-
(by=By.PARTIAL_LINK_TEXT,value='链接处的显示文本(的局部)—— 模糊匹配
5、 el_x = browser.find_element(by=By.LINK_TEXT,value='跳转百度') 6、 el_x = browser.find_element(by=By.PARTIAL_LINK_TEXT,value='百度')
-
(By.CSS_SELECTOR,'选择器(组合)') —— 与css样式表的选择器相似的使用方法
选择器有:
- 标签 —— tag
- id —— #id的值
- class —— .class的值
- (自定义)属性 —— [属性名 = '值']
el_s=browser.find_elements(by=By.CSS_SELECTOR,value='input')
el_x=el_s[0]
el_x=browser.find_element(by=By.CSS_SELECTOR,value='#id03')
el_x=browser.find_elements(by=By.CSS_SELECTOR,value='.小清新')[2]
el_x=browser.find_elements(by=By.CSS_SELECTOR,value="[type='text']")[1]
- 标签 —— tag
- id —— #id的值
- class —— .class的值
- (自定义)属性 —— [属性名 = '值']
el_s=browser.find_elements(by=By.CSS_SELECTOR,value='input')
el_x=el_s[0]
el_x=browser.find_element(by=By.CSS_SELECTOR,value='#id03')
el_x=browser.find_elements(by=By.CSS_SELECTOR,value='.小清新')[2]
el_x=browser.find_elements(by=By.CSS_SELECTOR,value="[type='text']")[1]
多选择器连接 —— 与 、 或
1、与 ———— 选择器1选择器2。。。
ys_s=browser.find_element(by=By.CSS_SELECTOR,value='#id03.小清新')
ys_yong_hu_wen_ben2.send_keys('000')
2、或 ———— 选择器1,选择器2,...
ys_s = browser.find_elements(by=By.CSS_SELECTOR, value='#id01, #id03')
ys_x = ys_s[0]
ys_y = ys_s[1]
通过元素的路径定位元素 ———— 元素1> 元素2 >...
el_x=browser.find_element(by=By.CSS_SELECTOR, value='div>a')
el_x.click()
8.XPATH="xpath"
XPath:XML语言路径:
1)XML:可扩展标记语言
2)HTML:一种特定的XML —— ——
- 标签 与 非标签(显示内容)
- 标签:标签名 与 属性
- 元素(节点):父子(嵌套)、兄弟(平级)
XPath:分隔符的使用
- 有单杠/ 和 双杠// 的分隔符
例举: xx/yy —— 代表yy是 紧邻 的下级
xx//yy —— 代表yy是xx的下级即可,不要求是 紧邻 的下级
XPath的基本语法
元素节点的路径定位:绝对路径、相对路径、分隔符
- 绝对路径 ————
1)/ 根部+
示例1: /html
2)从根部开始+
/标签节点1/标签节点2/...
示例2: /html/body/form/input
示例3:
el_x = browser.find_element(by=By.XPATH,value='/html/body/form/input')
el_x.send_keys('111')
- 相对路径
1) //标签节点1/标签节点2/... +
示例1: //form/input
2) //标签节点1/标签节点2/... +
示例2: //body/input
el_s = browser.find_elements(by=By.XPATH,value='//form/input')
el_x=el_s[0]
- 关于分隔符
标签节点1/标签节点2:(前后)紧邻
标签节点1//标签节点2:(前后)非紧邻,后继任意位置
(匹配)节点定位方法一:标签节点[@属性="值"]
在html中节点的名称为html的标签名,属性内容为“值”的所有标签节点
el_x = browser.find_element(by=By.XPATH, value='//input[@id="id01"]')
el_x.send_keys('555')
多属性组合定位
- 与+
标签节点[@属性1 = "值" and @属性2 = "值" ]
el_x = browser.find_element(by=By.XPATH, value='//input[@type="text" and @name="uname"]')
- 或+
标签节点[@属性1 = "值" or @属性2 = "值" ]
el_x = browser.find_element(by=By.XPATH, value='//input[@type="text" or @name="uname"]')
(匹配)节点定位方法二:标签节点[text()="值"]+
标签节点 [text()="值"]
文本内容为"值"的标签节点
el_x = br.find_element(by=By.XPATH,
value="//a[text()='跳转百度']")
组合节点定位方法
例如: //标签节点1[...]/标签节点2[...]/...
el_x = br.find_element(by=By.XPATH,
value="//form[@method="Get"]/input[1]")
其他
- 父节点/子节点[序号]
从1开始,表示父节点下的第几个子节点
示例: //form/input[1]
el_x = br.find_element(by=By.XPATH,
value="//form[@method="Get"]/input[1]")
- 附录XPath语法补充
实战技巧
首先考虑id值定位
其次考虑 选择器组合值 定位
再次考虑 xpath 值定位
可以借助Firefox 的开发者工具栏
web页面中元素的定位及操作——后续的处理
找到的元素,常被执行的操作—— (文本框)输入内容:
.send_keys(内容)
.clear()
示例:
el_x.send_keys('111')
el_x.clear()
el_x.send_keys('333')
(按钮/链接)点击
.click()
示例:
el_lian_jie.click()
web页面中元素的定位及操作——验证结果
- 页面的title
browser.title #属性
例如: # 是否抵达预期的新页面(也即页面标题是否OK)
if 'xxx' in browser.title:
print("xxx")
web页面中元素的定位及操作——小结
- 导入需要用到的模块(例如:selenium.webdriver.common.by.By 等待)
- 创建浏览器对象,也即打开浏览器
- 打开被测网址
- 找到(定位)要操作的元素节点
- 操作该元素
- 重复 #4,5,完成一个完整的业务操作流程
- 做预期的关键点结果验证
- 关闭浏览器,也即还原初始状态