Robot Framework - 将 Appium 驱动程序传递给 python 脚本
Posted
技术标签:
【中文标题】Robot Framework - 将 Appium 驱动程序传递给 python 脚本【英文标题】:Robot Framework - passing Appium driver to python script 【发布时间】:2014-09-13 09:24:42 【问题描述】:我正在使用 Python 将 Robot Framework 与 Appium 集成。但是我不知道如何将在 Robot Framework 中创建的 Appium 驱动程序传递给自定义 python 脚本。
我的环境:
Mac OS - 小牛队 Appium 1.2(通过自制软件安装) 最新的机器人框架(通过 pip 安装) Robot 框架的最新 Appium 库(通过 pip 安装)我有一个用 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库没有暴露execute_script,所以我需要在python库中编写自己的。
这是我的机器人测试脚本的开始,直到我需要执行脚本:
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\");")
但是,我似乎无法将驱动程序从机器人框架脚本传递给这个 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 脚本中?
【问题讨论】:
等一下,您是否为此使用了环境变量?尝试将 WD 传递给您的键盘脚本? 【参考方案1】:我目前没有使用 appium,所以我无法给出明确的答案。但是,有人问过关于 selenium 的类似问题,其中有人需要实际的 webdriver 对象。见问题Pass existing Webdriver object to custom Python library for Robot Framework
简短的回答是,您可以尝试对 appium 库进行子类化,以便您的关键字可以访问所有 appium 内部,或者您可以通过调用 BuiltIn().get_library_instance('Selenium2Library
来获取该库的句柄。
有关后一种技术的更多信息,请参阅Robot Framework User's Guide 中的Getting active library instance from Robot Framework。
【讨论】:
我会试试这个。我目前在下面使用我的解决方案,但这可能是一个不错的选择。 @sheeptest:没有“下面的解决方案”。请记住:*** 中的答案顺序会随着时间而变化。曾经的“下方”可能是“上方”或可能已被删除。 :) 谢谢。是的,我删除了它based on this meta post 布莱恩,非常感谢您的帮助。根据您在上面链接的答案,我在我的 Appium 特定解决方案中添加了一个单独的答案。再次感谢您的帮助。 顺便说一句,在这种情况下我接受哪个答案?我的还是你的?【参考方案2】:感谢 Bryan Oakley 的回复,他向我指出了解决方案,它是 Appium 库的子类化。
我进行了以下更改以使其正常工作
我的主要机器人框架测试文件不再引用 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 设置为变量,因为子类会自动访问它。不过,我现在可以在以后需要时通过“获取驱动程序实例”轻松地将其设置为变量。
感谢布莱恩的帮助!
【讨论】:
你能分享你完整的自定义 python 库吗?我尝试了您的解决方案,但没有打开任何应用程序,而我可以看到应用程序已经打开【参考方案3】:这里是您的问题的解决方案:)
from robot.libraries.BuiltIn import BuiltIn
def get_current_driver():
return BuiltIn().get_library_instance('AppiumLibrary')._current_application()
【讨论】:
我尝试了您的解决方案并得到了错误AttributeError: 'CustomClassandroid' object has no attribute '_current_application'
这是我从 AppiumLibrary 导入 AppiumLibrary from robot.libraries.BuiltIn import BuiltIn class CustomClassAndroid(): def get_current_driver(): return BuiltIn() 的完整代码.get_library_instance('AppiumLibrary')._current_application() def get_mobile_battery_info(self): self._current_application().execute_script("mobile: batteryInfo")以上是关于Robot Framework - 将 Appium 驱动程序传递给 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
Robot Framework - 将 Appium 驱动程序传递给 python 脚本
如何将数据驱动的概念应用于 Robot Framework 中的用户关键字?