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

17 投票
3 回答
18224 浏览
提问于 2025-04-18 06:48

我正在尝试为Robot Framework创建一个自定义的Python库,但我对Python和Robot都很陌生,不太确定该怎么做。我想把Robot使用Selenium2Library创建的Webdriver对象传递给我的自定义Python库,这样我就可以使用Webdriver的一些方法,比如find_element_by_id。我看到了一些关于如何做到这一点的建议,在这里在这里,但那些是针对Java库的,我找不到任何Python的说明。

我该如何在Python中做到这一点?或者我是否应该以不同的方式来做,而不传递Webdriver对象?

3 个回答

-1

你不一定要用robotframework来“打开浏览器”并在robot里创建所有步骤。你可以把robot当作一个调度器,直接调用普通的Python脚本,这些脚本里用到了selenium(可以通过pip安装selenium)。这样,在robot中你就会有一个包含多个小的Python脚本的测试套件,这些脚本都是用selenium写的。这种方法对编程技能的要求稍微高一些,但你在Python脚本中会用到更标准的代码写法,而不是robot的关键词驱动风格。因此,你可以把所有细节封装在Python脚本里,只把高层次的内容暴露给robot(通过测试套件)。

2

看看这个《Robot Framework 用户指南》的例子:

从 Robot Framework 获取活动库实例

相比于继承(之前有人提到过),最大的好处是你可以正常使用原来的库,同时在需要的时候再使用新的库。

26

这个库里没有直接的功能可以满足你的需求。不过,你可以自己创建一个库来使用selenium的功能。实现这个的方式有两种,都需要你在python中创建自己的库。这两种方法是:继承Selenium2Library,或者获取Selenium2Library实例的引用。

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

访问Selenium2Library内部功能的一种方法是编写一个库类,继承自Selenium2Library。这样一来,你就可以使用原库中的所有功能。你可以返回一个WebDriver对象的引用,或者直接在python中编写你自己的关键字。

举个例子,这里有一个自定义的selenium库,它有一个新关键字,可以返回当前的WebDriver实例。它通过调用一个原Selenium2Library中的私有方法_current_browser来实现。由于这是一个私有方法,未来可能会有变化,但在我写这段话的时候,它是存在的。

创建自定义selenium库

首先,创建一个新的python文件,命名为CustomSeleniumLibrary.py。把它放在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()

创建一个使用这个库的测试用例

接下来,编写一个测试用例,使用这个库而不是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对象...>信息证明了这个变量实际上持有一个python WebDriver对象的引用。使用robot的扩展变量语法,你可以调用这个对象的方法和访问它的属性。如果你想这样做,我不太推荐,但我觉得robot支持这个功能真的很有趣:

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

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

实现这个功能的第二种方法是使用robot获取库实例的方法,这样你就可以随意访问这个对象。这在robot用户指南中有详细说明;可以查看从Robot Framework获取活动库实例部分,具体内容在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}

撰写回答