[英]Robot Framework - passing Appium driver to python script
我正在使用 Python 将 Robot Framework 与 Appium 集成。 但是我不知道如何将在 Robot Framework 中创建的 Appium 驱动程序传递给自定义 python 脚本。
我的环境:
我在 Python 中有一个可用的 Appium 脚本,但我想开始使用 Robot Framework 来处理实际测试。
工作python脚本的部分代码:
wd = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
wd.find_element_by_name("Start").click()
wd.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIATableView[1]/UIATableCell[1]").click()
wd.execute_script("var vKeyboard = target.frontMostApp().keyboard(); vKeyboard.typeString(\"Test Text\");")
wd.execute_script("var vKeyboard = target.frontMostApp().keyboard(); vKeyboard.buttons()['Return'].tap();")
如您所见,由于应用程序的工作方式,我需要使用 execute_script 作为脚本的一部分。
Robot Framework 的 Appium 库没有公开 execute_script,所以我需要在 python 库中编写自己的库。
这是我的机器人测试脚本的开始,它在我需要 execute_script 之前一直有效:
TestStart
Open Application ${REMOTE_URL} ${PLATFORM_NAME} ${PLATFORM_VERSION} ${DEVICE_NAME} ${APP}
Click Element name=Start
Click Element xpath=//UIAApplication[1]/UIAWindow[1]/UIATableView[1]/UIATableCell[1]
我的问题是如何获取在 Open Application 中创建的驱动程序实例并将其传递给 Python 脚本?
我有一个 python 脚本,它具有以下内容:
def KeyboardType(driver):
driver.execute_script("var vKeyboard = target.frontMostApp().keyboard(); vKeyboard.typeString(\"hi there\");")
但是,我似乎无法将驱动程序从 Robot Framework 脚本传递到这个 python 脚本。
我尝试通过以下方式将 Open Application 设置为变量:
${Driver} Open Application ${REMOTE_URL} ${PLATFORM_NAME} ${PLATFORM_VERSION} ${DEVICE_NAME} ${APP}
KeyboardType ${Driver}
但我收到了错误:
AttributeError: 'str' 对象没有属性 'execute_script'
我还尝试将 Get Current Context 的结果传递到 python 脚本中,但随后我得到:
AttributeError: 'unicode' 对象没有属性 'execute_script'
如何将 Robot Framework 创建的驱动程序传递到 python 脚本中?
我目前不使用 appium,所以我无法给出明确的答案。 然而,有人问了一个关于 selenium 的类似问题,有人需要实际的 webdriver 对象。 请参阅问题将现有的 Webdriver 对象传递给 Robot Framework 的自定义 Python 库
简短的回答是,您可以尝试对 appium 库进行子类化,以便您的关键字可以访问所有 appium 内部结构,或者您可以通过调用BuiltIn().get_library_instance('Selenium2Library
.
有关后一种技术的更多信息,请参阅Robot Framework User's Guide中的从 Robot Framework 获取活动库实例。
感谢 Bryan Oakley 的回应,他向我指出了解决方案,即对 Appium 库进行子类化。
我进行了以下更改以使其正常工作
我的主要 Robot Framework 测试文件不再引用 Appium 框架,而是仅引用我的自定义 python 文件。
我的自定义 python 文件现在子类化了 Appium 库,所以我可以访问 _current_application()。
自定义 python 类现在看起来像这样:
from AppiumLibrary import AppiumLibrary
class Custom(AppiumLibrary):
def get_driver_instance(self):
return self._current_application()
def KeyboardType(self, textToType):
self._current_application().execute_script("var vKeyboard = target.frontMostApp().keyboard(); vKeyboard.typeString(\"" + textToType + "\");")
def PressKeyboardButton(self, buttonToPress):
self._current_application().execute_script("var vKeyboard = target.frontMostApp().keyboard(); vKeyboard.buttons()['" + buttonToPress + "'].tap();")
Robot Framework 文件现在看起来像这样:
TestStart
Open Application ${REMOTE_URL} ${PLATFORM_NAME} ${PLATFORM_VERSION} ${DEVICE_NAME} ${APP}
Click Element name=Start
Click Element xpath=//UIAApplication[1]/UIAWindow[1]/UIATableView[1]/UIATableCell[1]
KeyboardType Test 123
PressKeyboardButton Return
注意:此时,我不需要将 Open Application 设置为变量,因为子类会自动访问它。 但是,如果我需要它,我现在可以稍后通过“获取驱动程序实例”轻松地将其设置为变量。
感谢布赖恩的帮助!
这是您问题的解决方案:)
from robot.libraries.BuiltIn import BuiltIn
def get_current_driver():
return BuiltIn().get_library_instance('AppiumLibrary')._current_application()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.