selenium是一个模拟浏览器的类库,经常用来做自动化测试
python 可以直接使用安装目录下的Scripts\pip工具安装
以windows7 python3.4为例
运行cmd,
cd C:\Python34\Scripts
pip install selenium
一键安装完成,python脚本使用import selenium即可开始使用
下面是官网的一个例子:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
模拟了用Firefox浏览器(本地电脑必须安装相关浏览器)
打开 www.python.org,然后输入框输入 pycon搜索的 流程
根据官方文档,目前支持的模拟浏览器有
Firefox, Chrome, Ie and Remote.
selenium用webdriver模拟浏览器,get方法打开网页
接下来是获取页面元素
elem = driver.find_element_by_name("q")
看函数的命名我们知道是根据元素的name属性来获取
selenium提供了以下元素获取方式:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
-
find_element_by_css_selector
(注:这些方式均只能获取匹配的第一个元素)
- find_element_by_id ,find_element_by_name,class_name,tag_name
这些很简单,不多做解释,分别按元素的,id,name,class,tag属性来定位元素
文档说明是 定位XML节点,HTML可以看做XML的实现,你可以使用这个函数将节点绝对定位(但是不建议),也可以关联到一个有id和name属性的节点,这个定位器也可以用id,name之外的属性来定位
来看官网的例子:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
我们可以这样定位form:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
1.绝对定位,HTML只要有轻微的改变就会失效
2.找到HTML里的第一个form
3.找到id=loginForm的form
我们可以这样定位 username输入框:
username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
1.第一个form元素的input子元素,子元素有name=username的属性
2. id=loginForm的form元素的第一个input子元素
3.第一个name=username的input元素
.....
- find_element_by_link_text 和 find_element_by_partial_link_text
这两个是获取超链接的方法,我们可以用这个获取指定的链接文本的元素,但是这个方法只会返回第一个匹配的元素,如果没有匹配,会抛出一个 NoSuchElementException的异常,partial官网没有多作说明,使用的应该是部分匹配,输入目标文本的子串匹配即可
继续官网的例子
<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>
我们这样获取 Continue超链接(注意:匹配的是a标签之间的文本内容)
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')
这个方式如果了解JQuery和CSS的人应该不陌生,使用CSS选择器,这个应该是最强大的功能了,详细可以查阅
CSS选择器
如果想获取多个元素,讲上面的选取方法(除去id唯一的方法),element单词后面加s即为多选的选择器,返回一个python list
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
send_keys是模拟键盘的输入,特殊字符例如Enter,ALT,F1需要引入下面的模块,然后用相应的代码表示
selenium.webdriver.common.keys
官网地址:selenium-python.readthedocs.org
翻译地址:https://github.com/StephinChou/seleniumDocument