繁体   English   中英

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

[英]Robot Framework - passing Appium driver to python script

我正在使用 Python 将 Robot Framework 与 Appium 集成。 但是我不知道如何将在 Robot Framework 中创建的 Appium 驱动程序传递给自定义 python 脚本。

我的环境:

  • Mac OS - 小牛队
  • Appium 1.2(通过自制软件安装)
  • 最新的机器人框架(通过 pip 安装)
  • 机器人框架的最新 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 作为脚本的一部分。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM