2.开始使用
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 python_org_search.py
这段python程序运行之前你要确保你安装了Selenium模块。
2.2.上面例子的详解
Slenium WebDriver模块支持了所有的WebDriver实现。目前支持WebDriver实现的浏览器有火狐浏览器,谷歌浏览器,Ie浏览器以及远程。Keys类提供了一种功能,这种功能就像你从键盘输入字母一样。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
接下来,火狐浏览器的网页驱动实例将会被创造。
driver = webdriver.Firefox()
driver.get这种方法将会通过程序所给的URL来浏览一个网页。WebDriver将会等到这个网页加载完毕才会把控制权还给你所编写的测试或者脚本。值得注意的是如果你想要浏览的网页充满了大量的AJAX或许WebDriver并不知道什么时候才算是加载完毕。:
driver.get("http://www.python.org")
下面这一行是一个断言来确保title中包含“Python”:
assert "Python" in driver.title
WebDriver提供了很多用find_element_by_*
方法来查找元素的方法。例如,可以用find_element_by_name
方法通过输入文本元素的name属性来定位到输入文本元素。更多关于查找元素的方法在这里:
elem = driver.find_element_by_name("q")
接下来要传输keys,就像你通过键盘输入字母一样(在浏览网页的过程中)。一些特殊的键的输入将会用到从selenium.webdriver.common.keys
获取的Keys类来进行输入。为了安全起见,首先要清除输入字段的填充文本(例如:Serach)以免影响到我们的搜索结果。
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
在进行了页面提交之后,如果结果存在的话你还要获取结果。为了确保能够找到想要获取的结果,需要做一个断言:
assert "No results found." not in driver.page_source
最后,浏览器窗口需要关闭。也可以使用退出的方法来代替关闭。quit方法将会退出浏览器但是close方法只会退出一个标签页,如果浏览器只有一个标签页被打开,那么在默认情况下用close方法浏览器也会退出。
driver.close()
2.3.用Selenium来编写测试
Selenium经常会被用来编写测试案例。Selenium包并不包含测试框架。你可以用Python’s unittest模块来编写测试案例。也有其它的测试框架可以选择比如py.test和nose。
在这一部分中,我们会选择unittest框架。下面是利用unittest模块对开始的例子进行简单的改良。下面是对网页查找功能的一个测试:
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.测试例子的细致解释
首先,要导入所有需要的模块。unittese模块是python的内置模块(基于Java’s JUit)。这个模块提供了一种组织测试案例的框架。Selenium.WebDriver模块提供了所有WebDriver实现。目前支持WebDriver实现的工具有火狐浏览器,谷歌浏览器,IE浏览器以及远程。Keys类提供了从键盘输入的一些关键字例如:RETURN,F1,ALT等等。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
测试案例的类继承于unittest。继承自TestCase是一种告诉unittest模块这是一个测试案例的方法:
class PythonOrgSearch(unittest.TestCase):
setUp是初始化的一部分,这个方法要在所有你为test case类写入的测试函数之前被调用。下面的方法会为火狐浏览器驱动创建一个实例:
def setUp(self):
self.driver = webdriver.Firefox()
这是一个测试用例方法。测试用力方法通常会以字符测试开始。这个方法中的第一行在setUp方法中创建的驱动实例进行了一个局部引用:
def test_search_in_python_org(self):
driver = self.driver
driver.get这种方法将会通过程序所给的URL来浏览一个网页。WebDriver将会等到这个网页加载完毕才会把控制权还给你所编写的测试或者脚本。值得注意的是如果你想要浏览的网页加载时充满了大量的AJAX或许WebDriver并不知道什么时候才算是加载完毕。:
driver.get("http://www.python.org")
下面是一个断言确保title中包含”Python”:
self.assertIn("Python", driver.title)
WebDriver提供了很多用find_element_by_*
方法来查找元素的方法。例如,可以用find_element_by_name
方法通过输入文本元素的name属性来定位到输入文本元素。更多关于查找元素的方法在这里:
elem = driver.find_element_by_name("q")
接下来就要传输keys了,就像通过键盘输入字母一样(在程序中通过keys实现这样的功能)。一些特殊的keys需要从导入的selenium.webdriver.common.keys
来获取:
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
在进行页面提交之后,就要获取所有能找到的结果。如果没有找到结果那么可以用断言提前退出程序:
assert "No results found." not in driver.page_source
在所有的测试方法被调用完之后才会调用tearDown方法。这是一个用来清除所有程序所进行的活动的方法。在目前这种方法中,浏览器窗口会被关闭。你也可以用退出的方法来替代关闭方法。退出方法会退出整个浏览器,而关闭方法仅会关闭一个标签页,如果整个浏览器只有一个标签页被打开,那么在默认情况下关闭方法也会退出浏览器:
def tearDown(self):
self.driver.close()
最后是一行样板代码来运行测试:
if __name__ == "__main__":
unittest.main()
2.5.用Selenium来进行远程WebDriver
要想使用远程WebDriver,你要确保Selenium server正在运行。可以用下面这行代码来运行Selenium server:
java -jar selenium-server-standalone-2.x.x.jar
运行中,你会看到下面这样的信息:
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.HTMLU
ITWITHJS)
得到的desired capabilities是一个字典。如果你不想使用默认配置,你可以自己来配置所需要的参数:
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'browserName': 'htmlunit',
'version': '2',
'javascriptEnabled': True}
如有错误,敬请指正。