관리 메뉴

don't stop believing

Appium Command Line Server와 Appium Client (by Python) 본문

Testing Automation/Appium

Appium Command Line Server와 Appium Client (by Python)

Tongchun 2018. 7. 30. 11:01

Windows에서 Appium을 Command Line으로 실행하고 Python으로 작성된 Appium Client로 연결해 보겠습니다.


먼저 Appium Command Line 실행입니다.

프롬프트에서 Appium을 실행하려면 Node가 필요합니다. Node 홈페이지에서 Node를 다운받아 설치 합니다.

https://nodejs.org/en/download/



Windows Installer로 64-bit를 다운받아 설치합니다.

설치할 때는 설치되는 경로 정도는 확인해 줍니다.



node 설치가 끝나면 설치가 잘 되었는지 버전을 확인해 봅니다.

프롬프트(cmd)를 열고 node --version을 입력합니다.



이제 node로 Appium을 실행해야 하는데요, node를 띄우기 위해 Appium에 있는 main.js 파일을 찾아야 합니다.

버전에 따라 위치가 달라지긴 하지만 1.8.1 버전이라면 아래 경로에 있습니다.

C:\Program Files (x86)\Appium\resources\app\node_modules\appium\build\lib\main.js



프롬프트에서 main.js가 있는 위치로 이동합니다.

그리고 node를 이용해 main.js를 실해하는데 옵션으로 host와 port를 지정합니다.

node main.js -a 127.0.0.1 -p 4001



port를 바꿔가며 여러개의 Appium을 띄울 수 있습니다.


node를 설치했다면 npm을 사용할 수 있습니다. node에서 사용하는 package들을 관라하는 툴입니다.

node package중 appium-doctor라고 있습니다. appium을 사용하려면 여러 설정을 해야 하는데 이런 설정들이 잘 되어 있는지 확인해 주는 툴 입니다.


아래와 같이 npm으로 appium-doctor를 설치합니다.

npm install -g appium-doctor



appium-doctor가 설치가 되었다면 appium-doctor라고 입력하고 확인합니다.

만약 필요한 설정이 되어있지 않거나 문제가 있을 경우 붉은색으로 X표시가 나오게 됩니다.


이제 python으로 Appium Client를 만들어 보겠습니다.

python으로 만드는 것이니 python이 설치되어 있어야 겠죠. python 버전을 확인해 보겠습니다.

python --version


그리고 python에서 사용하는 package들을 관리(설치)하는 툴인 pip 버전도 확인해 줍니다.

pip은 python이 설치되면 자동으로 설치 됩니다. 

pip --version



pip까지 확인했다면 pip을 이용해 Appium-Python-Client를 설치해 줍니다.

pip install Appium-Python-Client



저는 이미 설치가 되어 있네요. Appium-Python-Client를 설치하면 selenium도 설치가 됩니다.


Appium Client를 작성하기 전에 adb를 이용해 device가 연결되어 있는지 다시 확인해 봅니다.



두 대가 연결되어 있네요.

0256edd60a7ec448은 Nexus 5X이고, 2a661df0은 SOL 입니다.


Python으로 Appium Client를 작성하기 위해 IDE 툴을 하나 실행합니다. 저는 sublime으로 하겠습니다.


먼저 Kakao Game SDK Test App을 Appium Client로 실행하도록 하겠습니다.

디바이스는 Nexus 5X에서 실행시킬 겁니다. Kakao Game SDK Test App을 실행시킨 Inspector 정보를 확인하면 도움이 됩니다.


아래 작성한 Python 코드는 Appium을 이용해 디바이스에 apk 파일을 설치, 실행하고 앱을 실행시킨 후 30초 동안 기다리다 끝나는 스크립트 입니다. 이후로 뭔가를 하려면 Native App일 경우 Selenium을 이용해 Object를 컨트롤 할 수 있고 Unity App일 경우 OpenCV로 이미지를 확인해 처리할 수 있습니다.


'''
Kakao Game SDK Test App
'''
import unittest
import os
from appium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 
class TableSearchTest(unittest.TestCase):
 
    def setUp(self):
        
        # Kakao Game SDK Test App 경로
        app = os.path.join(os.path.dirname(__file__), 'D:\\Test_Appium\\KakaogameSDK', 'KakaoGameSDK_Test_App_3.8.0.1.apk')
        app = os.path.abspath(app)

        # Set up appium
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4001/wd/hub',
            desired_capabilities={
                'app': app,
                'platformName': 'Android',
                'platformVersion': '6.0.1',
                'deviceName': 'Nexus 5X',
                'automationName': 'Appium',
                'appPackage': 'com.kakaogame.sample',
                'appActivity': 'com.kakaogame.sample.SampleActivity',
                'udid': '0256edd60a7ec448'
            })

    def test_search_field(self):
        driver = self.driver
        wait = WebDriverWait(driver, 20)

        sleep(30)
        # 테스트 시나리오에 따라 selenium 작성

        

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(TableSearchTest)
    unittest.TextTestRunner(verbosity=2).run(suite)


위 스크립트를 runKakaoGameSDKTest.py라고 저장하고 python으로 실행합니다.

python을 실행하기 전 appium이 실행되어 있는지 확인해야 합니다.


    


같은 방법으로 Checkers도 아내롸 같이 작성할 수 있습니다.


'''
Checkers 
'''
import unittest
import os
from appium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 
class TableSearchTest(unittest.TestCase):
 
    def setUp(self):
        
        # Kakao Game SDK Test App 경로
        app = os.path.join(os.path.dirname(__file__), 'D:\\Test_Appium\\Checkers', 'Checkers_v4.0.5_apkpure.com.apk')
        app = os.path.abspath(app)

        # Set up appium
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4001/wd/hub',
            desired_capabilities={
                'app': app,
                'platformName': 'Android',
                'platformVersion': '6.0.1',
                'deviceName': 'Nexus 5X',
                'automationName': 'Appium',
                'appPackage': 'com.dimcoms.checkers',
                'appActivity': 'com.dimcoms.checkers.MenuActivity',
                'udid': '0256edd60a7ec448'
            })

    def test_search_field(self):
        driver = self.driver
        wait = WebDriverWait(driver, 20)

        sleep(30)
        # 테스트 시나리오에 따라 selenium 작성

        

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(TableSearchTest)
    unittest.TextTestRunner(verbosity=2).run(suite)

여기까지 Appium Command Line 실해와 Python을 이용한 Appium Client 작성이었습니다.


3 Comments
  • 프로필사진 messier71 2018.11.09 17:49 연재해주신 내용 잘 따라가고 있습니다. 감사합니다.
    중간에 appium doctor 설치하고 확인하는 부분에서 윈도cmd 를 썼을 때는 "bin directory for $java_home is not set"라고 빨간 에러메시지를 띄웠는데, git bash를 쓰니까 잘 됩니다.
    저처럼 삽질하는 분들 계실까봐 코멘트 남깁니다.
  • 프로필사진 onlygu1988 2020.04.02 17:08 안녕하세요 오래된 글이나 아주 잘 보고 있습니다.
    혹시 답변 가능하실지는 모르겠는데
    Python으로 Appium Client 작성하는 단계에서 저는 bash를 통해 vi를 사용하여 작성하고 가이드 주신 것과 같이 확장자 .py로 저장하고 Python으로 실행하는 단계에서 "File"SyntaxError: unexpected character after line continuation charactoer"라고 뜨면서 실행이 안되고 있습니다. 구글링해서 답을 좀 찾아보다가 원하는 답변을 못찾고 있어서 이렇게 덧글로 문의 드립니다.
  • 프로필사진 sun77 2020.08.21 14:27 안녕하세요.
    먼저 좋은 정보를 알기 쉽게 설명해 주셔서 감사합니다.
    다름이 아니라 node main.js -a 127.0.0.1 -p 4001 명령어를 넣으면 아래와 같이 나오는데요.
    여기저기 찾아 보다가 모르겠어서 문의 드립니다.

    (node:24020) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
    C:\Users\user\AppData\Local\Programs\Appium\resources\app\node_modules\appium\lib\main.js:4
    import { init as logsinkInit } from './logsink';
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1053:16)
    at Module._compile (internal/modules/cjs/loader.js:1101:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
댓글쓰기 폼