入门

简单用法

如果已经具备了Selenium&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

示例解释

selenium.webdriver 模块提供了WebDriver全部实现。目前支持WebDriver实现的是Firefox、Chrome、IE和Remote. Keys类提供键盘操作比如RETURN, F1,ALT等。   from selenium import webdriver form selenium.webdriver.common.keys import keys

接下来,火狐的WebDriver实例被创建。

driver = webdriver.Firefox()

driver.get方法会导航到url指定的页面。webdriver会等待页面完全加载后,把控制权还给test脚本。需要注意的是,如果页面中使用了大量的AJAX负载过大,webdriver可能不知道什么时间加载完成。

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

下一行断言确认包含"Python"字母在里面:

assert "Python" in driver.title

webdriver 提供一些如find_element_by_*的方法用于定位元素。例如,输入文本元素可以通过find_element_by_name方法使用名称属性来定位。定位方法会在后续进行详细解释。

elem = driver.find_element_by_name("q")

接下来,是发送关键信息,比较像从键盘输入。特殊关键信息可以通过selenium.webdriver.common.keys中的Keys 类实现。安全考虑,首先要确认输入区没有其他信息(如“搜索框”),以免影响搜索结果:

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

提交页面后,可以看到搜索结果或没有找到。为了确保找到了一些结果,我们需要做一些断言:

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

最后,要关闭浏览器窗口。还可以通过调用quit方法去关闭。quit方法会退出整个浏览器,close会关闭一个标签页,默认情况下,大部分浏览器会关闭整个浏览器:

driver.close()

sample1: 测试百度首页的查询功能: 百度搜索框“” code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash/env python
# -*- coding: utf-8 -*-
import sys
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
reload(sys)
sys.setdefaultencoding('utf8')

driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
assert "百度一下,你就知道" in driver.title
#elem = driver.find_element_by_name("wd") #locate by name
##elem = driver.find_element_by_id("kw") #locate by id
elem = driver.find_element_by_xpath("//*[@id='kw']") # locate by xpath
elem.clear() #
elem.send_keys("isoft")
elem.send_keys(Keys.RETURN)
driver.implicitly_wait(100)
assert "No results found." not in driver.page_source
time.sleep(10)
driver.close()

使用Selenium编写测试

Selenium 大部分情况下都是用来编写测试用例的。Selenium本身是不提供测试工具或框架的。可以通过Python的unittest 模块去编写case,另外还可以通过pt.test或nose框架。

下面是一个使用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

示例解析

最初,基本模块需要导入。unittest基于java的junit的内嵌模块。该模块提供了测试组织的框架。selenium.webdriver模块提供了WebDriver的所有实现。目前支持的是firefox chrome ie remote。Keys类提供了键盘输入如RETURN F1 ALT等.

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

测试用例类继承自unittest.TestCase,通过这个方式说明这是一个测试用例:

class PythonOrgSearch(unittest.TestCase):

Setup是初始化的一部分,这个方法在进行编写测试用例之前被每个测试方法调用。这里以firfox webdriver为例。

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

这是一个测试用例的方法。这个测试用例方法总是characters 测试开始。第一行是创建一个本地driver,来源于setUp方法。

def test_search_in_python_org(self):
    driver = self.driver

driver.get 方法会导航到URL指定的页面。Webdriver会等待页面加载完成。需要注意的是,如果页面中使用了大量的AJAX负载过大,webdriver可能不知道什么时间加载完成。

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

下一行断言确认包含"Python"字母在里面:

assert "Python" in driver.title

webdriver 提供一些如find_element_by_*的方法用于定位元素。例如,输入文本元素可以通过find_element_by_name方法使用名称属性来定位。定位方法会在后续进行详细解释。

elem = driver.find_element_by_name("q")

接下来,是发送关键信息,比较像从键盘输入。特殊关键信息可以通过selenium.webdriver.common.keys中的Keys 类实现。安全考虑,首先要确认输入区没有其他信息(如“搜索框”),以免影响搜索结果:

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

提交页面后,可以看到搜索结果或没有找到。为了确保找到了一些结果,我们需要做一些断言:

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

tearDown方法每个测试方法之后都会调用。这是用来清理动作的地方。当前这个方法,实现了浏览器的关闭。同样可以调用quit方法替换close.quit方法有些地方是关闭一个标签页,默认情况下是关闭整个浏览器。

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

最后是标准代码用于执行测试:

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

sample 测试百度搜索 code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash/env python
# -*- coding: utf-8 -*-
import sys
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
reload(sys)
sys.setdefaultencoding('utf8')

class BaiduSearch(unittest.TestCase):

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

    def test_search_in_baidu(self):
        driver = self.driver
        driver.get("https://www.baidu.com")
        self.assertIn("百度一下,你就知道", driver.title)
        elem = driver.find_element_by_id("kw")
        elem.clear()
        elem.send_keys("isoft")
        elem.send_keys(Keys.RETURN)
        assert "No result found." not in driver.page_source

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

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

使用Selenium remote WebDriver

使用remote WebDriver之前需确保Selenium server在运行。启动该server命令:

java -jar selenium-server-standalone-2.x.x.jar

运行Selenium server时,会返回以下信息: 15:43:08.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 DesiredCapbilities

driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444/wd/hub',
    desired_capabilities=DesiredCapbilities.CHROME)

driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444/wd/hub',
    desired_capabilities=DesiredCapbilities.OPERA)

driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444/wd/hub',
    desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)

功能是个字典结构,可以通过字典来明确指定这些值:

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

Top^

上一篇Selenium主题1 下一篇Selenium主题3

by 李鹏