selenium_webdriver
[TOC]
selenium webdriver简介
本文是学习了《Selenium自动化测试完全指南》和其他网络上的教程写出的学习笔记
介绍
WebDriver是一种API和协议,它定义了一种不依赖于编程语言、用于控制Web浏览器行为的接口
Selenium通过WebDriver来支持各种浏览器的自动化。
每种浏览器还需要有一个特定的基于WebDriver的实现来负责控制浏览器,这种实现称为驱动程序。驱动程序通常为可执行文件(.exe),一般由浏览器厂商开发并提供。
安装
查看自己的浏览器版本,然后搜索对应浏览器驱动版本进行下载,解压出压缩包内的Chormedriver.exe文件,配置该文件所在目录到环境变量Path(可选).
测试使用
1 | from selenium import webdriver |
下面都以Chrome浏览器为例
浏览器窗口的基本操作
浏览器导航操作
打开get、后退back、前进forward、刷新refresh
1 | wd.get('https://www.baidu.com') |
浏览器窗口操作
调整浏览器窗口的位置和大小,以及关闭浏览器窗口
1 | wd.minimize_window() # 最小化窗口 |
获取浏览器信息
标题和网址、窗口位置和大小
1 | wd.title #获取浏览器窗口当前的标题 |
查找页面元素
按id、name、class属性查找
按照HTML元素的id属性查找元素
1 | wd.find_element_by_id("id属性值") |
ps: 一般情况下请尽量使用id或name属性进行查找,因为这两个属性通常用作元素的唯一标识,但class属性可能会被多个元素引用。
按链接文本查找
按链接的文本查找元素
1 | wd.find_element_by_link_test("链接的文本") |
按标签类型查找
按照HTML标签类型查找元素
1 | wd.find_element_by_tag_name("HTML标签名称") |
ps: 一个页面中可能会有多个HTML标签相同的元素,除非页面上只有一个该类型的标签,否则可能会查找到其他元素而非目标元素。请尽量使用其他类型的查找方式。
按XPath查找
XPath是一种综合性的查找方式,不仅支持前几种查找方式,而且还能通过XPath表达式进行更加丰富的高级查找。
XPath的全称为XML路径语言(XML Path Language),使用路径表达式来选取XML文档中的节点或者节点集,类似文件系统
1 | wd.find_element_by_xpath("XPath表达式") |
基于绝对路径或相对路径定位
1 | # 路径以斜线(/)开始,那么该路径就表示到一个元素的绝对路径。 |
基于索引或属性定位
1 | # 索引定位非常简单,使用中括号[]并填入索引即可 |
基于轴定位
基于相对关系的定位
1 | wd.find_element_by_xpath("//span[@class='soutu-btn']/following::input[1]") |
基于函数或表达式定位
1 | wd.find_element_by_xpath("//a[text()='hao123']") #查找文本为hao123的a元素 |
按CSS选择器查找
CSS选择器也是一种综合性的查找方式,它不但支持前3种查找方式,而且能通过CSS选择器进行更加丰富的高级查找。
1 | wd.find_element_by_css_selector("CSS选择器") |
通过层级关系定位
1 | wd.find_element_by_css_selector("html > body > div > div > div > div > div > form > span > input") |
基于关键属性定位
1 | wd.find_element_by_css_selector("#kw") #符号"#"代表使用id匹配,即匹配id为kw的元素 |
基于属性进行模糊定位
1 | wd.find_element_by_css_selector("[href^='https://www.hao']") #查找href属性值以https://www.hao开头的元素 |
相对来说,更推荐使用XPath表达式
通过By对象按动态条件查找
在之前的查找中,都直接使用对应的查找函数来查找元素,但这样做并不利于代码的维护。在分层较好的测试框架中,查找动作与查找条件互相隔离,查找元素时并不知道是按什么方式查找的,只是依赖于动态传入的条件,因此这种条件并不能完全确定,可能是按id查找,也可能是按其他方式查找。
1 | from selenium.webdriver.common.by import By |
查找元素集合
1 | wd.find_elements_...() |
嵌套查找
已有元素嵌套查找元素,查找在已有元素之下符合条件的子元素
1 | baiduSearchForm = wd.find_element(By.ID, "form") |
页面元素的基本操作
1 | # 单击元素 |
下拉框元素的选项操作
之前的操作都用WebElement对象的函数来进行操作,但下拉框使用Select对象的函数,因此需要先将WebElement对象转换成Select对象才能进行下拉框的操作
1 | from selenium.webdriver.support.select import Select |
获取页面元素的内容
获取元素的基本属性
1 | webElement.id # 标示 |
获取元素的HTML属性、DOM属性及CSS属性
1 | # HTML属性 |
当浏览器加载页面时,它会解析HTML并从中生成DOM对象。对于元素节点,大多数标准HTML属性会自动成为DOM对象的属性。DOM对象是一个继承自Object的普通JavaScript对象,这里所说的DOM属性,正是指该JavaScript对象的属性。自定义属性不会映射到DOM属性上。
1 | # DOM属性 |
获取元素的位置与大小
1 | webElement.location #获取位置对象 |
获取下拉框元素的选项
1 | from selenium.webdriver.support.select import Select |
处理浏览器弹出框
在浏览器中,弹出框分为3种——Alert、Confirmation以及Prompt。
Alert:提示框,只有一个“确定”按钮(对应的JavaScript代码为alert(‘这是Alert’);)
Confirmation:确认框,需要选择(对应的JavaScript代码为confirm(‘这是Confirmation’);)
Prompt:输入框,需要输入内容(对应的JavaScript代码为prompt(‘这就是prompt’,”);)
在WebDriver中,以上弹出框统一视为Alert对象,只需调用Alert对象的方法即可。
1 | # 获取Alert对象 |
多网页切换操作
多浏览器窗口的切换主要依赖于浏览器窗口句柄,只要得到了WebDriver拥有的全部句柄,就可以切换到指定句柄的浏览器窗口。
1 | # 获取句柄 |
IFrame切换
IFrame在比较早的年代使用较多,但Ajax开始流行后,IFrame的使用场景越来越少
1 | driver.switch_to.frame(IFrame元素) #切换到当前页面(或IFrame)的下一级指定IFrame中 |
结束WebDriver会话
1 | driver.close() # 关闭WebDriver当前所在的窗口 |