zoukankan      html  css  js  c++  java
  • [译]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})
    
  • 相关阅读:
    显卡信息
    统一处理labelme标注的json文件名
    Qt窗口设置最大高度
    未定义av_image_get_buffer_size
    AVPixelFormat
    树结构系列开篇:聊聊如何学习树结构?
    PriorityQueue 是线性结构吗?90%的人都搞错了!
    硬核!史上最全的工厂模式文章,从零到一全面讲解!
    如何从分类层面,深入理解设计模式?
    程序员重构入门指南
  • 原文地址:https://www.cnblogs.com/taceywong/p/6602641.html
Copyright © 2011-2022 走看看