[译]Selenium Python文档:二、初步开始

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类提供了键盘按键的键值,如RETURNF1ALT等。

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})
posted @ 2017-03-22 23:01  Tacey Wong  阅读(2160)  评论(0编辑  收藏  举报