我正在使用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用作脚本的一部分。
Appium Library for Robot Framework不公开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脚本?
答案 0 :(得分:3)
我目前不使用appium所以我无法给出明确的答案。然而,一个类似的问题是关于硒,有人需要实际的webdriver对象。请参阅问题Pass existing Webdriver object to custom Python library for Robot Framework
简短的回答是,您可以尝试将appium库子类化,以便您的关键字可以访问所有appium内部,或者您可以通过调用BuiltIn().get_library_instance('Selenium2Library
来获取库的句柄。
有关后一种技术的详细信息,请参阅Getting active library instance from Robot Framework中的Robot Framework User's Guide。
答案 1 :(得分:1)
这是您的问题的解决方案:)
from robot.libraries.BuiltIn import BuiltIn
def get_current_driver():
return BuiltIn().get_library_instance('AppiumLibrary')._current_application()
答案 2 :(得分:0)
感谢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设置为变量,因为子类可以自动访问它。但是,如果我需要,我现在可以通过“获取驱动程序实例”轻松地将其设置为变量。
感谢Bryan的帮助!