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学习笔记

Robot Framework - 将 Appium 驱动程序传递给 python 脚本

如何将数据驱动的概念应用于 Robot Framework 中的用户关键字?

ROBOT Framework无法单击弹出接受按钮

在 Robot framework 数据驱动方法中生成测试用例

Robot Framework 测试套件目录如何精确工作?