1. Selenium与WebDriver简介
Selenium的好处是可以模拟用户操作,在浏览器上自动进行测试,功能测试时可以自动保存cookie等信息无需代码发送。webDriver本是selenium1的竞争对手,后来二者进行了整合,结合了各自的优势,形成了webdriver。
#python3.7
#引用
from selenium import webdriver
#浏览器有很多种,我用的是chrome
browser = webdriver.Chrome()
ps. 调用Chrome需要下载Chromedrive.exe驱动放在python根目录下。
需要注意的是,一定要查看Chrome版本下载对应的驱动版本,否则运行代码时会导致浏览器无限重启报错。
贴一个国内ChromeDriver的下载镜像: https://npm.taobao.org/mirrors/chromedriver/
2. 基本语法
① 声明实例: browser = webdriver.Chrome()
② 打开网页: browser.get()
③ 查找元素: 定位页面中的元素,从而完成点击输入等操作
#打开网页
url = "https://www.baidu.com/"
browser = webdriver.Chrome()
browser.get(url)
#查找页面元素的方法:
element = browser.find_element_by_id()
element = browser.find_element_by_name()
element = browser.find_element_by_xpath()
element = browser.find_element_by_link_text()
element = browser.find_element_by_partial_link_text()
element = browser.find_element_by_tag_name()
element = browser.find_element_by_class_name()
element = browser.find_element_by_css_selector()
browser.close()
插件工具: Selenium为Chrome和Firefox提供了浏览器插件,可以用来记录浏览器的操作行为,并生成Python代码. 可以简化一部分工作量.https://www.selenium.dev/downloads/
① 与postman有一点类似,新建一个测试项目:
② 测试用例录制后,选择Export导出
③ 然后选择对应的导出语言
eg. 以百度搜素首页为例进行元素的定位
1、<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
2、<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>
3、<div class="bdbriimgtitle">更多产品</div>
对应的元素检索方法:
element = browser.find_element_by_id("kw")
element = browser.find_element_by_name("wd")
element = browser.find_element_by_xpath()
element = browser.find_element_by_link_text("新闻")
element = browser.find_element_by_partial_link_text("产品")
element = browser.find_element_by_tag_name("input")
element = browser.find_element_by_class_name("s_ipt")
element = browser.find_element_by_css_selector()
#关于find_element_by_xpath的使用方法,有通过元素属性定位,和通过绝对路径定位两种,推荐通过元素属性定位
#结尾有Xpath的语句结果说明
#选取所有属性id=kw的标签
element = browser.find_element_by_xpath(" //*[@id="kw"] ")
#选取所有属性class=s_ipt的标签
element = browser.find_element_by_xpath(" //*[@class="s_ipt"] ")
#使用条件组合
element = browser.find_element_by_xpath(" //*[@id="kw" and @class="s_ipt"]")
#选取所有属性maxlength=255的input标签
element = browser.find_element_by_xpath(" //input[@maxlength="255"] ")
#通过绝对路径定位
#说明:div[2]表示第二个 div 标签
element = find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input")
#关于tag_name的使用方法,tag_name就是每个元素的标签名:
# coding="utf-8"
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
#path.abspath()方法用于获取当前路径下的文件
file_path = "file:///" + os.path.abspath("checkbox.html")
print(file_path)
driver.get(file_path)
#选择页面上所有的tag name为input的元素
inputs = driver.find_elements_by_tag_name("input")
#然后从中过滤出type为checkbox的元素,单击勾选
for i in inputs:
if i.get_attribute("type") == "checkbox":
i.click()
time.sleep(5)
driver.quit()
3. Xpath定位方法
1. XPath路径表达式:
表达式 | 描述 |
---|---|
nodeName | 选取此节点的所有子节点。 |
/ | 从根节点选取该元素。 |
// | 选取匹配当前名称的所有节点,不考虑节点位置。 |
. | 选取当前节点。 |
. . | 选取当前节点的父节点。 |
@ | 选取属性。 |
举个例子:
表达式 | 描述 |
---|---|
bookStore | 选取bookStore元素的所有子节点。 |
/bookStore | 选取名为bookStore的根元素。 |
bookStore/book | 选取bookStore下的所有book元素。 |
//book | 选取所有book元素,而不管他们在文档中的位置。 |
bookStore//book | 选取bookStore下的所有book元素,而不管他们在bookStore中位置。 |
//@languane | 选取名为language的所有属性。 |
2. XPath谓语用法:
表达式 | 结果 |
---|---|
/bookStore/book[1] | 选取属于 bookStore 子元素的第一个 book 元素。 |
/bookStore/book[last()] | 选取属于 bookStore 子元素的最后一个 book 元素。 |
/bookStore/book[last() - 1] | 选取属于 bookStore 子元素的倒数第二个 book 元素。 |
/bookStore/book[position() < 3] | 选取属于bookStore book 子元素的前两个book元素。 |
//title[@lang] | 选取拥有名为lang属性的title元素 |
//title[@lang=‘eng’] | 选取lang属性为eng的title元素 |
/bookStore/book[price>35.00] | 选取bookStore下的book元素,且book元素中的price元素值大于35.00 |
/bookStore/book[price>35.00]//title | 选取bookStore中price大于35的book元素下的所有title元素 |
3. 匹配未知节点:
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
举个例子:
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素下的所有子元素。 |
//* | 选取文档中的所有元素 |
//title[@*] | 选取所有带属性的title元素 |