将现有的Webdriver对象传递到Robot Fram的自定义Python库

2024-04-19 08:46:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为Robot框架创建一个定制的Python库,但是我对Python和Robot还不熟悉,我不知道如何完成我正在尝试的工作。我想把Robot使用Selenium2Library创建的Webdriver对象传递给我的自定义Python库,这样我就可以使用Webdriver的方法,比如find_element_by_id。我看到一些关于如何做到这一点的建议herehere,但它们是针对Java库的,我找不到任何Python指令。

我怎么用Python来做这个呢?或者我想以不同的方式执行此操作,而不传递Webdriver对象?


Tags: 对象方法框架idbyhere方式指令
3条回答

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

图书馆里没有任何东西可以让你做自己想做的事。但是,您可以创建自己的库来访问selenium特性。有两种方法可以实现这一点,这两种方法都需要用python创建自己的库。这些方法是要将Selenium2Library子类化,或者获取对Selenium2Library实例的引用。

创建一个Selenium2Library子类的自定义库

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

例如,这里有一个自定义的selenium库,它有一个新的关键字,该关键字将返回当前的WebDriver实例。它通过调用private(到原始的Selenium2Library)方法_current_browser来实现这一点。因为这是一个私有方法,所以不能保证它能经受住时间的考验,但是在我写这篇文章的时候,它是存在的。

创建自定义硒库

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

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

创建使用库

的测试用例

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

*** 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对象的引用。使用robot的extended variable syntax可以调用方法并访问该对象上的属性(如果需要)。我不建议这样做,但我认为机器人支持它真的很有趣:

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

创建引用selenium2库的自定义库

实现这一点的第二种方法是使用robot的方法来获取库的实例,此时您可以根据需要访问对象。这在robot用户指南中有记录;请参见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()

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

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

查看Robot Framework用户指南示例:

Getting active library instance from Robot Framework

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

相关问题 更多 >