将现有的Webdriver对象传递给Robot Framework的自定义Python库

时间:2014-05-16 20:16:36

标签: python selenium-webdriver robotframework

我正在尝试为Robot Framework创建一个自定义Python库,但我是Python和Robot的新手,我不知道如何完成我想要做的事情。我想将使用Selenium2Library创建的Robot的Webdriver对象传递给我的自定义Python库,以便我可以使用Webdriver的方法,例如find_element_by_id。我已经看到了有关如何执行此操作的一些建议herehere,但它们适用于Java库 - 我无法找到任何Python指令。

我将如何在Python中执行此操作?或者我想以不同方式执行此操作,而不传递Webdriver对象?

3 个答案:

答案 0 :(得分:25)

图书馆内没有任何内容可让您按照本身进行操作。但是,您可以创建自己的库来访问selenium功能。有两种方法可以实现这一点,这两种方法都需要在python中创建自己的库。这些方法是Selenium2Library的子类,或者是对Selenium2Library实例的引用。

创建子类Selenium2Library

的自定义库

访问Selenium2Library内部的一种方法是编写一个继承自Selenium2Library的库类。执行此操作后,您可以访问原始库中的所有内容。然后,您可以返回对WebDriver对象的引用,或者您可以在python中编写自己的关键字。

举个例子,这里有一个自定义的selenium库,它有一个新的关键字,可以返回当前的WebDriver实例。它通过调用private(到原始的Selenium2Library)方法_current_browser来实现。由于这是一种私人方法,因此无法保证它能经得起时间的考验,但在我写这篇文章的时候它就存在了。

创建自定义selenium库

首先,创建一个名为CustomSeleniumLibrary.py的新python文件。把它放在机器人可以找到它的地方 - 最简单的事情就是把它放在与要使用它的测试套件相同的文件夹中。将以下内容放入该文件中:

from Selenium2Library import Selenium2Library

# create new class that inherits from Selenium2Library
class CustomSeleniumLibrary(Selenium2Library):
    # create a new keyword called "get webdriver instance"
    def get_webdriver_instance(self):
        return self._current_browser()

创建一个使用库

的测试用例

接下来,编写一个使用它而不是Selenium2Library的测试用例。例如:

*** Settings ***
| Library | CustomSeleniumLibrary.py
| Suite Teardown | close all browsers

*** Test Cases ***
| Example using custom selenium library
| | Open browser | http://www.example.com | browser=chrome
| | ${webdriver}= | Get webdriver instance
| | log | webdriver: ${webdriver}

运行测试

像进行任何其他测试一样运行测试。完成后,您应该在日志中看到类似的内容:

16:00:46.887 INFO webdriver: <selenium.webdriver.chrome.webdriver.WebDriver object at 0x10b849410>

使用测试用例中的对象

神秘的...<selenium....WebDriver object...>消息证明该变量实际上包含对python WebDriver对象的引用。使用extended variable syntax机器人,您可以根据需要调用方法并访问该对象上的属性。我不建议这样做,但我认为机器人支持它真的很有趣:

| | log | The page title is ${webdriver.title}

创建引用Selenium2Library

的自定义库

实现此目的的第二种方法是使用机器人获取库实例的方法,此时您可以根据需要访问该对象。这在机器人用户指南中有记录;请参阅Getting active library instance from Robot Framework中的Robot Framework User's Guide

例如,上例中的get_library_instance关键字如下所示:

from robot.libraries.BuiltIn import BuiltIn

def get_webdriver_instance():
    se2lib = BuiltIn().get_library_instance('Selenium2Library')
    return se2lib._current_browser()

请注意,在这种情况下,您必须同时包含Selenium2Library 自定义库:

*** Settings ***
| Library | Selenium2Library
| Library | CustomSeleniumKeywords.py
| Suite Teardown | close all browsers

*** Test Cases ***
| Example using custom selenium keyword
| | Open browser | http://www.example.com | browser=chrome
| | ${webdriver}= | Get webdriver instance
| | log | webdriver: ${webdriver}

答案 1 :(得分:2)

查看Robot Framework用户指南示例:

<强> Getting active library instance from Robot Framework

继承的最大好处(如前所述)是您可以正常使用原始库,并在需要时使用新库。

答案 2 :(得分:-1)

你不需要机器人做太多的工作来打开浏览器&#34;并在机器人中创建所有步骤。您可以使用机器人作为音序器,并使用selenium从机器人常规python脚本调用(使用pip安装selenium)。然后,在机器人中,您将拥有一个带有selenium的常规小python脚本的测试套件。这在编程技巧方面要先进一步,但你会在机器人关键字驱动风格的python脚本中使用更多标准编码语法。因此,您可以在python脚本中封装所有细节,并仅向机器人公开高级别(通过测试套件)。