2014-07-22 6 views
2

저는 Robot Framework와 Appium을 파이썬으로 통합하려고합니다. 그러나 Robot Framework에서 만든 Appium 드라이버를 사용자 지정 Python 스크립트에 전달하는 방법을 알아낼 수 없습니다.Robot Framework - Python 스크립트에 Appium 드라이버 전달하기

내 환경 :

  • 맥 OS - 매버릭스
  • Appium 1.2 (PIP를 통해 설치)
  • 최신 로봇 프레임 워크 (홈 양조를 통해 설치)
  • 이 최신 로봇 프레임 워크에 대한 Appium 라이브러리 (설치 pip 통해)

나는 파이썬에서 작동하는 Appium 스크립트가 있지만, 나는 Robot Framework를 사용하기 시작했다. 실제 테스트를 처리합니다. 파이썬 스크립트를 사용하기위한

부분 코드 :

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를 노출하지 않으므로 파이썬 라이브러리에 직접 작성해야합니다.

는 여기에 내가 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] 

내 질문은 내가 오픈 응용 프로그램 및 패스에서 만든 드라이버 인스턴스를 얻는 방법 파이썬 스크립트에?

def KeyboardType(driver): 
    driver.execute_script("var vKeyboard = target.frontMostApp().keyboard(); vKeyboard.typeString(\"hi there\");") 

그러나, 나는이 파이썬 스크립트에 로봇 프레임 워크 스크립트에서 드라이버를 통과 할 수없는 것 :

나는 다음이있는 파이썬 스크립트를 가지고있다.

나는 통해 변수에 열기 응용 프로그램을 설정하려고 :

${Driver} Open Application ${REMOTE_URL} ${PLATFORM_NAME} ${PLATFORM_VERSION} ${DEVICE_NAME} ${APP} 
KeyboardType ${Driver} 

그러나 나는 오류가 발생 :

AttributeError : 'STR'개체가 어떤 속성 'execute_script'도

I이 없습니다 현재 컨텍스트 가져 오기 결과를 파이썬 스크립트에 전달하려고 시도했지만 다음과 같이 나타납니다.

AttributeError : 'unicode'객체에 'execute_scrip'속성이 없습니다. t '

Robot Framework에서 만든 드라이버를 python 스크립트에 어떻게 전달할 수 있습니까?

+0

잠깐이 환경 변수를 사용하고 있습니까? WD를 키보드 스크립트에 전달하려고합니까? – sheeptest

답변

2

저는 현재 appium을 사용하지 않으므로 확실한 답을 드릴 수 없습니다. 그러나 셀레늄과 관련하여 비슷한 질문이 제기되었습니다. 셀렌은 실제 웹 드라이브 개체가 필요한 곳입니다.질문을 참조하십시오 Pass existing Webdriver object to custom Python library for Robot Framework

간단히 대답하면 키워드가 모든 appium 내부에 액세스 할 수 있도록 appium 라이브러리의 서브 클래스를 만들거나 BuiltIn().get_library_instance('Selenium2Library을 호출하여 라이브러리를 처리 할 수 ​​있다는 것입니다.

Robot Framework User's GuideGetting active library instance from Robot Framework을 참조하십시오.

+0

나는 이것을 시도 할 것이다. 현재 아래의 솔루션을 사용하고 있지만 좋은 대안이 될 수 있습니다. – sheeptest

+0

@sheeptest : "아래 솔루션"이 없습니다. 기억 : 스택 오버 플로우의 응답 순서는 시간이 지남에 따라 변합니다. 한 번 '아래'는 '위에'있거나 삭제되었을 수 있습니다. –

+0

:) 감사합니다. 예, 삭제했습니다. [이 메타 게시물을 기반으로] (http://meta.stackoverflow.com/questions/263046/should-i-delete-my-own-downvoted-answer/263048#263048) – sheeptest

0

Bryan Oakley의 응답 덕분에 그는 Appium 라이브러리의 하위 클래스 인 솔루션에 대해 지적했습니다.

가 나는

내 주요 로봇 프레임 워크 테스트 파일이 더 이상 Appium 프레임 워크를 참조 작동하지 않을 수 있도록 다음과 같이 변경했다, 대신 단지 내 사용자 정의 파이썬 파일을 참조합니다.

사용자 정의 파이썬 파일은 이제 Appium 라이브러리를 하위 클래스로 분류하므로 _current_application()에 액세스 할 수 있습니다.

는 사용자 정의 파이썬 클래스는 이제 다음과 같습니다

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();") 

로봇 프레임 워크 파일이 이제 다음과 같습니다

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 

참고 :이 시점에서, 나는를 설정할 필요가 없습니다 하위 클래스가 자동으로 변수에 액세스하기 때문에 응용 프로그램을 변수에 엽니 다. 그러나 나중에 필요한 경우 'get driver instance'를 통해 변수에 쉽게 설정할 수 있습니다.

도움을 주셔서 감사합니다. Bryan!

관련 문제