将现有的Webdriver对象传递给Robot Framework的自定义Python库
3 个回答
你不一定要用robotframework来“打开浏览器”并在robot里创建所有步骤。你可以把robot当作一个调度器,直接调用普通的Python脚本,这些脚本里用到了selenium(可以通过pip安装selenium)。这样,在robot中你就会有一个包含多个小的Python脚本的测试套件,这些脚本都是用selenium写的。这种方法对编程技能的要求稍微高一些,但你在Python脚本中会用到更标准的代码写法,而不是robot的关键词驱动风格。因此,你可以把所有细节封装在Python脚本里,只把高层次的内容暴露给robot(通过测试套件)。
看看这个《Robot Framework 用户指南》的例子:
相比于继承(之前有人提到过),最大的好处是你可以正常使用原来的库,同时在需要的时候再使用新的库。
这个库里没有直接的功能可以满足你的需求。不过,你可以自己创建一个库来使用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}