开始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 python_org_search.py

在运行上面的代码之前确保selenium模块已经安装。

2.2 例子详解

selenium.webdriver模块提供所有的WebDriver实现,现在支持的WebDriver实现有Firefox,Chrome,IE和远程执行,keys类支持键盘键例如:回车,F1, ALT等等。

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

下面,创建一个Firefox的WebDriver实例。

driver = webdriver.Firefox()

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方法通过其name属性来定位输入文本元素。

elem = driver.find_element_by_name("q")

接下来,我们发送按键,这类似于使用键盘输入按键。可以使用从selenium.webdriver.common.keys导入的keys类来发送特殊的键。为了安全起见,我们将首先清除输入字段(如“Search”)中任何预先填充的文本,这样它就不会影响我们的搜索结果:

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

提交页面后,如果有结果,应该得到结果。为了确保找到某些结果,请作出以下断言:

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

最后,关闭浏览器窗口。您也可以调用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()

你可以在shell中执行上面的测试用例

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

OK

上面的结果表示测试用例执行完成。

2.4 看一下例子

首先要导入基础的模块,unittest是居于java的JUnit并且内置于Python,这个模块提供了测试用例的框架,selenium.webdriver模块提供所有的webdriver实现。目前支持webdriver实现的有
 Firefox, Chrome, Ie和远程调用,Keys类在键盘中提供诸如RETURN、F1、ALT等键。

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

测试用例类继承于unittest.TestCase,继承TestCase类着可以可以告诉unittest模块这是一个测试用例。

class PythonOrgSearch(unittest.TestCase):

setUp是初始化方法,这个方法将会在测试用例里首先被调用,创建一个WebDriver的Firefox实例。

这里是测试用例的方法,测试用例方法名总是以test开头,方法的第一行创建一个在setUp方法创建的driver对象的本地引用。

def test_search_in_python_org(self):
    driver = self.driver

最后是运行测试用例的程序入口

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

2.5 使用Selenium的远程WebDriver

使用远程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})

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容