2.Selenium Python开始


开始

简单的使用

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

运行的python需要安装selenium模块

实例分析

selenium.webdriver模块提供了所有WebDriver的实现,现在支持的WebDriver的实现有Firefox,Ie,Chrome,Remote,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")

WebDrive提供了一系统find_element_by_*的方法的方法来寻找页面元素,例如,我们利用find_element_by_name方法,通过元素的name属性来定位一个文本输入框元素。更详细的寻找元素的方法可以参见第四章-元素定位:

elem = driver.find_element_by_name("q")

然后我们发送了一些字符,可以用键盘直接输入。特殊的键盘符我们可以导入selenium.webdriver.common.keys,然后用Keys类来表示:

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经常被用来编写写测试用例,它本身的包不提供测试工具的框架。我们可以用Python的单元测试模块来编写测试用例。另一个工具/框架的选择是???工具/框架的选项是py.test和鼻子。)在本章节我们使用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

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

实例分析

脚本的开头我们约会了所有需要的模块,单元测试是python内置的基于Java's JUnit的模块,提供了组织单元测试的框架。 selenium.webdriver模块提供了WebDriver的所有实现:Firefox,即Chrome,Remote,Keys类提供了键盘的代码(回车,ALT,F1等等):

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

测试用例类继承了unittest.TestCase类,这表明这个类是一个测试用例:

class PythonOrgSearch(unittest.TestCase):

setUp函数进行了初始化,你将要在这个类里编写的所有测试方法都要先调用这个方法,然后我们创建了一个Firefox WebDriver实例:

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

接下来是测试用例的方法,它应该总是以字符'test'开始。方法的第一行本地引用了setUp方法中创建的驱动程序对象:

def test_search_in_python_org(self):
    driver = self.driver

driver.get方法会引导给定的URL的页面,WebDriver会等待页面完全加载完(就是onload函数被触发了),才把程序的控制权交给你的测试或者脚本。但是如果你的页面用了太多的AJAX ,那么这个机制就没什么卵用了,因为它不知道页面到底是什么时候加载完。

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

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

self.assertIn("Python", driver.title)

WebDrive提供了一系统find_element_by_*的方法的方法来寻找页面元素,例如,我们利用find_element_by_name方法,通过元素的name属性来定位一个文本输入框元素。更详细的寻找元素的方法可以参见第四章-元素定位:

elem = driver.find_element_by_name("q")

然后我们发送了一些字符,可以用键盘直接输入。特殊的键盘符我们可以导入selenium.webdriver.common.keys,然后用类来表示:

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

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

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

最后的浏览器窗口被关闭了,你也可以调用quit方法来代替close,区别在于quit会退出整个浏览器,而close只有关闭一个标签,但是如果浏览器只有一个标签,那么这两个方法完全一样,都会关闭整个浏览器。

driver.close()

最后一行是一些运行测试套件的样板代码:

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

使用Selenium的远程WebDriver

要使用远程WebDriver,您先要运行硒服务器,用以下这个命令:

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是一个dict,如果你不使用替换的dict,你可以自己指定值:

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities={'browserName': 'htmlunit',
                         'version': '2',
                        'javascriptEnabled': True})