开始

简单用法

如果你已经安装好Python 和 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()

把上面的脚本保存到一个文件中(比如:python_org_search.py),然后就可以这样运行它了

python python_org_search.py

运行时需要已经安装过 selenium 库了

用法解析

selenium.webdriver 模块提供了所有 WebDriver的实现,现在支持的WebDriver的实现有 Firefox,Ie,Chrome 和远程浏览器. Keys 类提供了键盘的按键编码(比如回车,ALT,F1等等)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

然后我们创建一个Firefox的实例

driver = webdriver.Firefox()

driver.get 方法会打开给定的URL的页面,WebDriver会等待页面完全加载完(就是 “onload” 函数触发了), 再开始执行你的测试脚本.

但是如果你的页面用了太多的AJAX,那么这个机制就没什么卵用了,因为它不知道页面到底是什么时候加载完。

driver.get("http://www.python.org")

下面代码是断言网页标题是否包含 “Python” 关键字

assert "Python" in driver.title

WebDrive提供了一系统类似于 find_element_by_* 的方法来寻找页面元素, 例如,我们利用 find_element_by_name 方法,通过元素的 name 属性来定位一个文本输入框元素.

更多查找元素的文档参考 元素定位

elem = driver.find_element_by_name("q")

接着我们输入了一些字符,类似于用键盘直接输入. 特殊的键盘符我们可以用 Key 输入, 需要导入 selenium.webdriver.common.keys 包. 安全起见, 输入字符前清楚掉原来的内容, 以免产生错误结果.

elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

提交页面之后我们应该确认一下是否有返回,为了确定有返回值,我们在这里下一个断言:

assert "No results found." not in driver.page_source

最后浏览器窗口被关闭了,你也可以调用 quit 而不是 close ,区别在于 quit 会退出整个浏览器, 而 close 只会关闭一个标签,但是如果浏览器只有一个标签,大部分浏览器的行为是相同的,就是关闭整个浏览器。

driver.close()

使用Selenium编写测试代码

Selenium经常被用来写测试用例,它本身的包不提供测试的工具或者框架。 我们可以用Python的单元测试模块来编写测试用例. 或者使用 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()

你可以在shell里运行这个测试用例

python test_python_org_search.py
.
----------------------------------------------------------------------
Ran 1 test in 15.566s

OK

上面的结果表明我们的测试用例成功执行了

测试代码分析

脚本的开头我们引入了所有需要的模块, unittest 模块是 Python内置的单元测试模块, 就好像 Java里面的JUnit. unittest 模块实现了WebDriver的全部测试接口的功能. 目前支持的 WebDriver 包括 Firefox, Chrome, Ie 和 远程调试. Keys 类提供了键盘模拟输入.

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

测试用例类继承了 unittest.TestCase 类,TestCase 类的子类都被认为是测试用例

class PythonOrgSearch(unittest.TestCase):
        pass

测试用例初始化时会首先调用 setUp 方法.

下面的例子中我们创建了一个 Firefox WebDriver 实例

def setUp(self):
        self.driver = webdriver.Firefox()

下面的代码是一个测试某个功能点错的方法, 所有测试方法的名称都必须以 test 字符串开头. 方法的第一行新建了一个变量 driver 引用了 setUp 方法中创建的driver对象

def test_search_in_python_org(self):
        driver = self.driver

driver.get 方法会打开给定的URL的页面

driver.get("http://www.python.org")

下一行是个断言,确认页面标题里是否有 Python 这个单词

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

测试类的所有测试方法执行结束后, 会调用 tearDown 方法. 这个方法适合用来清理之前测试方法留下的残留数据.

def tearDown(self):
        self.driver.close()

最后一行代码是Python的固定用法, 程序由这里开始执行

if __name__ == "__main__":
        unittest.main()

使用Selenium 的 remote WebDriver

要使用remote 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连接到 remote 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}
)