2.1.简单使用
如果已经安装好了Selenium Python,你就可以像下面这样编写Python代码来使用它了:
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.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
上面的脚本可以保存到一个文件(例如:python_org_search.py)。接着,可以像下面这样来运行它(你应该确保要使用的Python已经正确安装了selenium模块):
$python python_org_search.py
2.2.示例讲解
selenium.webdriver
模块提供了所有的WebDriver实现。当前Selenium支持的WebDriver实现由火狐、Chrome、IE和远程。Keys
类提供了键盘按键的键值,如RETURN
、F1
、ALT
等。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
接着,Firefox WebDriver实例被创建:
driver = webdriver.Firefox()
driver.get
方法根据给定的URL访问Web 页面。在将控制权交给你的测试脚本之前,WebDriver将会等待页面完全加载(也就是说,等待onload
事件被触发)。值得注意的是如果你的页面在加载的时候使用了大量的AJAX,WebDriver有可能不知道它是否已经加载完成:
driver.get("http://www.python.org")
接下来的一行是一个断言,用来确保标题中有“Python”这个单词:
assert "Python" in driver.title
WebDriver为寻找页面元素提供了大量方法,他们都是find_element_by_*
的形式。举个例子,input text
元素可以根据他的name值使用find_element_by_name
来进行定位。在后续的元素定位那一章将会对元素定位做更为详细的介绍。
elem = driver.find_element_by_name("q")
接下来我们发送了一个“按键”值,这和你使用键盘的输入非常相似。特殊案件可以通过从selenium.webdriver.common.keys
导入的Keys
类进行发送。安全起见,我们首先清除输入框中的预置文本(比如,“搜索”,"Serach")。以保证它不会影响我们的搜索结果:
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)#Keys.ENTER
在页面提交之后,你应该会得到相应的搜索结果。为了保证一些结果被找到,作一个断言:
assert "No results found." not in driver.page_source
最后,关闭浏览器窗口。你也可以调用quit
来代替close
方法。quit
将会关闭整个浏览器,而close
将会仅关闭一个标签页。如果只打开了一个标签页的话,大多数浏览器默认会关闭整个浏览器:
driver.close()
2.3.使用Selenium编写测试
Selenium常被用于编写测试样例。selenium包本身并不提供测试工具/框架,你可以使用Python的unittest
模块来编写测试。另外可选的测试工具/框架是py.test和nose。
本章我们选择使用unittest
做测试框架。这里是经修改的unittest模块使用样例。本脚本用来测试python.org的搜索功能:
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
def test_search_in_python_org(self):
driver = self.driver
driver.get("http://www.python.org")
self.assertIn("Python", 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
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
你可以从命令行来运行上面的测试样例,如:
python test_python_org_search.py
.
----------------------------------------------------------------------
Ran 1 test in 15.566s
OK
上面的结果表明测试已经成功完成。
2.4.通览示例
首先,加载所有需要的基础模块。unittest是基于Java JUnit的Python自建模块。该模块提供了组织测试样例的框架。selenium.driver
模块提供了所有的WebDriver实现。当前支持的WebDriver实现有:火狐、Chrome、IE和远程。类提供了键盘按键的键值,如RETURN、F1、ALT等。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
test case
类继承自unittest.TestCase
。从TestCase
进行继承会告诉unittest
模块这是一个测试样例:
class PythonOrgSearch(unittest.TestCase):
setUp
用来进行初始化,在测试样例类中编写的所有测试函数执行之前被调用。在这里,我们创建了一个Firefox(火狐)WebDriver的实例:
def setUp(self):
self.driver = webdriver.Firefox()
下面是一个测试样例方法。测试样例方法一般应首先进行字符测试。该函数中的第一行创建了一个本地引用,引用的是在setUp
中创建的driver对象:
def test_search_in_python_org(self):
driver = self.driver
driver.get
方法根据给定的URL访问Web 页面。在将控制权交给你的测试或者脚本之前,WebDriver将会等待页面完全加载(也就是说,等待onload
事件被触发)。值得注意的是如果你的页面在加载的时候使用了大量的AJAX,WebDriver有可能不知道它是否已经加载完成:
driver.get("http://www.python.org")
接下来的一行是一个断言,用来确保标题中有“Python”这个单词:
self.assertIn("Python" ,driver.title)
WebDriver为定位页面元素提供了大量方法,他们都是find_element_by_*
的形式。举个例子,input text
元素可以根据他的name值使用find_element_by_name
定位。在后续的元素定位那一章将会对元素定位做更为详细的介绍。
elem = driver.find_element_by_name("q")
接下来我们发送了一个“按键”值,这和你使用键盘的输入非常相似。特殊案件可以通过从selenium.webdriver.common.keys导入的Keys类进行发送。安全起见,我们首先清除输入框中的预置文本(比如,“搜索”,"Serach")。以保证它不会影响我们的搜索结果:
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)#Keys.ENTER
在页面提交之后,你应该会得到相应的搜索结果。为了保证一些结果被找到,作一个断言:
assert "No results found." not in driver.page_source
tearDown
方法将会在所有的测试方法执行之后调用。此函数用来做一些清理工作。在当前方法中,清理工作是关闭浏览器。你也可以调用quit
方法来代替close
方法。quit
将会关闭整个浏览器,而close
将会仅关闭一个标签页。如果只打开了一个标签页的话,大多数浏览器默认会关闭整个浏览器:
def tearDown(self):
self.driver.close()
最后一行用来运行测试套件:
if __name__ == "__main__":
unittest.main()
2.5.通过远程WebDriver使用Selenium
要使用远程WebDriver,你应该先运行Selenium server。可以使用下面的命令启动它:
java -jar selenium-server-standalone-2.x.x.jar
Selenium server启动之后你可以看到像下面的一条消息:
15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
上面那行说明你可以使用这个URL来连接远程WebDriver。这里是一些示例:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.OPERA)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)
desired capabilities
是一个字典,要替换字典中默认键值的话,你可以显式指定对应的值:
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'browserName': 'htmlunit',
'version': '2',
'javascriptEnabled': True})