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

Posted

技术标签:

【中文标题】将现有的 Webdriver 对象传递给 Robot Framework 的自定义 Python 库【英文标题】:Pass existing Webdriver object to custom Python library for Robot Framework 【发布时间】:2014-07-05 09:55:45 【问题描述】:

我正在尝试为 Robot Framework 创建一个自定义 Python 库,但我是 Python 和 Robot 的新手,我不确定如何完成我想要做的事情。我想将 Robot 使用 Selenium2Library 创建的 Webdriver 对象传递给我的自定义 Python 库,以便我可以使用 Webdriver 的方法,例如 find_element_by_id。我已经看到了一些关于如何做到这一点的建议 here 和 here,但它们是针对 Java 库的——我找不到任何 Python 指令。

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

【问题讨论】:

【参考方案1】:

库中没有内置任何东西可以让你做你想做的事情本身。但是,您可以创建自己的可以访问 selenium 功能的库。有两种方法可以做到这一点,这两种方法都需要在 python 中创建自己的库。这些方法用于继承 Selenium2Library,或获取对 Selenium2Library 实例的引用。

创建一个继承 Selenium2Library 的自定义库

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

例如,这是一个自定义 selenium 库,它有一个新的关键字,它将返回当前的 WebDriver 实例。它通过调用私有(原始 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>

在测试用例中使用对象

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

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

创建一个引用 Selenium2Library 的自定义库

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

例如,上面示例中的 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

【讨论】:

【参考方案2】:

查看 Robot Framework User's Guide 示例:

Getting active library instance from Robot Framework

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

【讨论】:

【参考方案3】:

您不需要robotf-ramework 来“打开浏览器”并在robot.xml 中创建所有步骤。您可以将机器人用作定序器,并使用 selenium 从机器人常规 python 脚本中调用(使用 pip 安装 selenium)。然后,在机器人中,您将拥有一个带有 selenium 的常规小型 Python 脚本的测试套件。这在编程技能方面有点进步,但是您将在机器人关键字驱动风格的 Python 脚本中使用更标准的编码语法。因此,您可以将所有细节封装在 python 脚本中,并且只向机器人公开高级别的(通过测试套件)。

【讨论】:

以上是关于将现有的 Webdriver 对象传递给 Robot Framework 的自定义 Python 库的主要内容,如果未能解决你的问题,请参考以下文章

将硒驱动程序传递给scrapy

将现有的 Kendo 网格绑定到新的 JSON 对象

如何将库类或对象传递给片段?

.Net 将对象列表作为参数传递给 JQuery

将两个对象传递给mvc中的视图[重复]

将对象类型作为参数传递给方法?