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

时间:2014-07-22 13:55:45

标签: python robotframework appium

我正在使用Python将Robot Framework与Appium集成。但是,我无法弄清楚如何将在Robot Framework中创建的Appium驱动程序传递给自定义python脚本。

我的环境:

  • Mac OS - Mavericks
  • Appium 1.2(通过家庭酿造安装)
  • 最新机器人框架(通过点子安装)
  • 最新的机器人框架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 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脚本?

3 个答案:

答案 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的帮助!