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

摘要:
目前,Selenium支持Firefox、Chrome、IE和Remote实现的WebDriver。特殊情况可从硒中找到。webdriver。common发送导入的密钥类。退出将关闭整个浏览器,而关闭将仅关闭一个选项卡。selenium包本身不提供测试工具/框架。您可以使用Python的unittest模块来编写测试。Unittest是一个基于JavaJUnit的Python自建模块。从TestCase继承将告诉unittest模块这是一个测试样本:classPython OrgSearch:setUp用于初始化,并在执行测试样本类中编写的所有测试函数之前调用。

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})

免责声明:文章转载自《[译]Selenium Python文档:二、初步开始》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一则 Oracle 和 SqlServer 语法区别 (原创)9、IPA通路分析相关网页教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python测试开发django-31.admin后台一对多操作ForeignKey

前言 平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息。一般会建两张表,一张表放银行的信息,一张表放银行卡信息。 每个银行可以对应多个银行卡,每个银行卡只能是一家银行的。那么银行名称和银行卡就是一对多的关系,反之,银行卡和银行名称就是多对一的关系 一对多表设计 准备两张表,银行信息(Bank)和卡号信息(Ca...

Protobuf 语法指南

英文: Proto Buffers Language Guide 本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样生成.proto文件的数据访问类。(本文只针对proto2的语法) 本文是一个参考指南——如果要查看如何使用本文中描述的多个特性的循序渐进的例子,请在http...

Python 的音乐库

前言 其实处理这个用 Matlab 最方便,之前把 guitar-synthesizer 从 Matlab 移植到 Python,过程中更是体会到了这一点。不过 Matlab 安装包又大,启动又慢,还是收费软件。。平常也不怎么用得到,毕竟我也不搞算法、仿真。 所以还是,Python 真香hhh 库 音乐的时域处理 标准库有个 wave 模块,可以转成 w...

python+requests接口自动化测试实战

python+request+unittest+HTMLTestRunner 首先介绍一下python的requests模块: requests的使用介绍:requests快速入门 环境说明: 1.WIN 7, 64位2.Python3.4.3 (pip-8.1.2)3.Requests —>pip install requests4.Unittes...

在lua环境中使用protobuf

最近在cocos2dx的项目中,需要在LUA脚本层使用protobuf协议。官方已经推出了很多种语言的版本。但唯独LUA版本不全。于是开始研究protobuf在LUA下的实现,将完整的过程记录了下来,希望对其它人能有所帮助。 1、下载protoc-gen-lua 可以通过HG从服务器(hg clonehttps://code.google.com/p/pr...

python读取文件时出现多余的ufeff时的解决方法及原因

当使用python读取文件后打印结果意外多出了一个ufeff,如图: 那要如何解决呢?其实也很简单只要将encoding = 'utf-8' 改成encoding = 'UTF-8-sig'就搞定了,如图: 问题是解决了,但是这到底是什么原因呢? 答:在编写文本时保存时包含了BOM(Byte Order Mark,字节顺序标记,出现在文本文件头部,Un...