๋ชจ๋ฐ”์ผ ๋งคํฌ๋กœ ์ž๋™ํ™”, ํœด๋Œ€ํฐ ์—†์ด ํ•˜๊ธฐ, ๋…น์Šค ์• ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ adb ์—ฐ๊ฒฐํ•˜์—ฌ Appium ๊ตฌ๋™ํ•˜๊ธฐ, Python + Appium + Nox
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋””์ง€ํ„ธ ๊ฟ€ํŒ

๋ชจ๋ฐ”์ผ ๋งคํฌ๋กœ ์ž๋™ํ™”, ํœด๋Œ€ํฐ ์—†์ด ํ•˜๊ธฐ, ๋…น์Šค ์• ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ adb ์—ฐ๊ฒฐํ•˜์—ฌ Appium ๊ตฌ๋™ํ•˜๊ธฐ, Python + Appium + Nox

by ์ผ์ƒ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค 2022. 11. 19.

๊ฐ€๋” ๊ฐœ๋ฐœ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ฑ„๋„์„ ํ†ตํ•ด ๋ฌธ์˜๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค. ์ตœ๊ทผ ์งˆ๋ฌธ ๋ฐ›์€ ๋‚ด์šฉ ์ค‘์— ํ•˜๋‚˜์— ๋Œ€ํ•ด ๊ณต์œ ๋“œ๋ ค๋ด…๋‹ˆ๋‹ค.

Q. ์—ํ”ผ์›€ Appium ์ด ์•ˆ๋“œ๋กœ์ด๋“œ ์• ๋ฎฌ์—์„œ๋„ ๋™์ž‘์ด ๋˜๋‚˜์š”?

๋„ค

Q. xx ์•ฑ ๊ตฌ๋™ ์‹œ ๋™์ž‘์ด ์ž˜ ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€์š”??

init ์ดˆ๊ธฐ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฐ’์˜ ๋ฌธ์ œ์˜ ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ฒˆ์—๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ๊ณ„์—์„œ ๋ชจ๋ฐ”์ผ ๋งคํฌ๋กœ ์ž๋™ํ™”๋ฅผ ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ… ํ–ˆ์—ˆ๋Š”๋ฐ์š”. ์‚ฌ์‹ค ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์ง€๋งŒ ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์• ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœ๋“œ๋ ค๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

[์นด์นด์˜ค๋ทฐ ์ž๋™ํ™”] ์นด๋ทฐ ๊ด€๋ฆฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ appium ์‚ฌ์šฉ ๋ง›๋ณด๊ธฐ 1๋‹จ๊ณ„

์˜ˆ๋ž‘์ด๊ฐ€ ์ด๋Ÿฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๋ ค์ค˜์„œ ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋ผ์„œ ๋‚ฏ์„ค์—ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์ฒ˜๋Ÿผ ์ฒซ ์…‹ํŒ…๋งŒ ์ž˜ํ•ด๋ณด๋ฉด ๋‹ค ๋น„์Šทํ•˜๊ณ  ๊ฒฐ๊ตญ์—” python์œผ๋กœ ์ฝ”๋”ฉ

odaily.tistory.com


์‚ฌ์ „์— Appium ์„ค์น˜๋ฅผ ํ•˜์…”์•ผ์ง€๋งŒ, ์•„๋ž˜ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์•„๋ž˜ ์˜์ƒ์„ ์ฐธ๊ณ ํ•˜์…”์„œ ์„ค์น˜ํ•˜์‹œ๊ณ  ๋‚œ ๋’ค ํ•ด๋‹น๊ธ€์„ ๋‹ค์‹œ ๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋น ๋ฅธ Appium ์„ค์น˜ ๋ฐ ์„ค์ • ๊ฐ€์ด๋“œ


์ด ์ „์—๋„ ์• ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋™์ž‘ํ•œ๋‹ค๊ณ ๋Š” ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ๊ฐ„๋‹จํžˆ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๋˜๋Š” ์ •๋„๋งŒ ํ™•์ธ ํ•˜์˜€๊ณ , ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” PC ์•ฑ ํ”Œ๋ ˆ์ด์–ด์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. (ex. ๋…น์Šค ์•ฑํ”Œ๋ ˆ์ด์–ด, ๋ฏธ๋ฎค ๋“ฑ)
๋ชจ๋ฐ”์ผ ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์—†๋Š” ๋ถ„๋“ค์€ ์‹ค์ฒด ๋ชจ๋ฐ”์ผ ๊ณต๊ธฐ๊ณ„๋ฅผ ๊ตฌ์ž…ํ•˜์ง€ ์•Š์•„๋„ PC๊ฐ€ ์žˆ๋‹ค๋ฉด ํœด๋Œ€ํฐ์ฒ˜๋Ÿผ ์–ดํ”Œ์„ ์„ค์น˜ํ•˜์—ฌ ๋งคํฌ๋กœ๋ฅผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๊ณต์œ ๋“œ๋ฆฌ๋Š” ๋‚ด์šฉ์€ ๋…น์Šค ์• ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ + Appium ์—ฐ๋™ํ•˜์—ฌ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋…น์Šค ์•ฑํ”Œ๋ ˆ์ด์–ด ์„ค์น˜ ๋ฐ ์„ค์ •

๋…น์Šค ์•ฑํ”Œ๋ ˆ์ด์–ด - ์œˆ๋„์šฐ ์ปดํ“จํ„ฐ,๋งฅ๋ถ๊ณผ ํ˜ธํ™˜์„ฑ์ด ๋›ฐ์–ด๋‚œ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ๋ฌด๋ฃŒ ์•ˆ๋“œ๋กœ์ด

์ง€๊ธˆ๊นŒ์ง€ ์จ๋ณธ ์•ฑํ”Œ๋ ˆ์ด์–ด์ค‘์—” ๋…น์Šค๊ฐ€ ์ œ์ผ ์ข‹์€๊ฒƒ ๊ฐ™์•„์„œ ๋ช‡๋…„ ์ „๋ถ€ํ„ฐ ๊ณ„์† ์• ์šฉ์ค‘์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์œ ์ € ์˜๊ฒฌ ๋งŽ์ด ๋ฐ›์•„๋“ค์ด๊ณ  ๋ฒˆ์ฐฝํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค :)

kr.bignox.com

* ์ฐธ๊ณ ๋กœ Mac์—์„œ๋„ ์„ค์น˜๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ตœ๊ทผ์— ์—…๋ฐ์ดํŠธ ๋œ Ventura์—์„œ๋Š” 99% ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š์•„ ๊ณ ๋ฏผ์— ๋น ์ ธ์žˆ๋‹ต๋‹ˆ๋‹ค.
๋…น์Šค๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Android 7์ด ์„ค์น˜๋˜๋Š”๋ฐ ๋…น์Šค ๋งค๋‹ˆ์ € โ†’ ๋ฉ€ํ‹ฐ ์‹คํ–‰์—์„œ Android 9 ๋ฒ„์ „์˜ ์• ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ์„ค์น˜ํ•ด์•ผ ์ตœ๊ทผ ๋‚˜์˜จ ์•ฑ๋„ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•


๋…น์Šค ์„ค์น˜ ํ›„, ์„ค์น˜๋œ ์• ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋ฉด ์„ค์ •์— ๋“ค์–ด๊ฐ€์„œ ROOT ์ผœํ‚ค๋ฅผ ๊ผญ ์ฒดํฌํ•˜๊ณ  ์žฌ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…น์Šค ์•ฑํ”Œ๋ ˆ์ด์–ด ์„ค์ •์€ ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” Appium ์„ค์ •์ž…๋‹ˆ๋‹ค.

Appium ์‹คํ–‰ ๋ฐ ์—ฐ๊ฒฐ

์šฐ์„  ์„ค์น˜๋œ ๋…น์Šค ์• ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ adb์— ์ž˜ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋‹ค๊ณ  ๋œจ๋ฉด, ๊ทธ ๋•Œ appium ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ python ์†Œ์Šค๋ฅผ ์‹คํ–‰ ์‹œ์ผœ๋ด…๋‹ˆ๋‹ค.

adb ํ™•์ธํ•˜๊ธฐ

python ์†Œ์Šค

์•„๋ž˜ ์†Œ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ appium์—์„œ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์†Œ์Šค์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.common.by import By
from appium.webdriver.common.appiumby import AppiumBy
from appium import webdriver
import time
from time import sleep


caps = {
    "platformName": "Android", 
    "appium:platformVersion": "9",  #๋…น์Šค ์• ๋ฎฌ๋ ˆ์ดํ„ฐ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „
    "appium:deviceName": "NoxPlayer", #๋…น์Šค ์• ๋ฎฌ๋ ˆ์ดํ„ฐ device ์ด๋ฆ„
    "appium:app": "C:/test/testapp.apk", #ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ์€ ์•ฑ apk ํŒŒ์ผ ์œ„์น˜
    "appium:automationName": "Appium", 
    "appium:newCommandTImeout": 3600,
    "appium:appPackage": "com.example.package", #ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ์€ ์•ฑ ํŒจํ‚ค์ง€๋ช…
    "appium:appActivity": "com.activity.MainActivity", #ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ์€ ์•ฑ ๋ฉ”์ธ activity
    "appium:udid": "127.0.0.1:62001", #๋…น์Šค ์•ฑํ”Œ๋ ˆ์ด์–ด ๊ณ ์œ  id
    "appium:noReset": "true", 
    "appium:fullReset": "false",
    "appium:ensureWebviewsHavePages": True, 
    "appium:nativeWebScreenshot": True, "appium:newCommandTimeout": 3600,
    "appium:connectHardwareKeyboard": True
}


try :
	print("\nSTART...")
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps) #appium ์„œ๋ฒ„ 
    
    sleep(100)
    
finally:
	driver.quit()
	print("\nEND...")

์‹ค์ œ ๋…น์Šค ์•ฑํ”Œ๋ ˆ์ด์–ด ํ™”๋ฉด

1. python ํŒŒ์ผ 1ํšŒ ์ •์ƒ ๋™์ž‘์‹œ Appium Settings๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

  • ์•ฑ ๊ถŒํ•œ ์„ค์ • ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ๋„ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •
    ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ ์„ค์ • ๊ถŒํ•œ์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์ž‘ ๊ฐ€๋Šฅํ•œ ์„ค์ •๊ณผ ๋ฐฐํ„ฐ๋ฆฌ ์ตœ์ ํ™” ์„ค์ •์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ํœด๋Œ€ํฐ ์„ค์ •๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ผ์„ฑ ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ๋ฅผ ๊ธฐ์žฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. (https://www.samsungsvc.co.kr/solution/540313)

2. ํ•œ ๋ฒˆ ๋” python ํŒŒ์ผ ์‹คํ–‰์‹œ test app ์„ค์น˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ์‹œ์Šคํ…œ ๊ถŒํ•œ์€ ๋‹ค ๋ถ€์—ฌํ•˜๋ผ๋Š” ํŒ์—…์ด ๋œน๋‹ˆ๋‹ค. (test app์€ adb๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ถ”์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, pureapk ์‚ฌ์ดํŠธ์—์„œ ๋น ๋ฅด๊ฒŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
3. 3๋ฒˆ์งธ python ํŒŒ์ผ ์‹คํ–‰ ์‹œ ๋กœ๊ทธ์ธ์ด default๋กœ ์ž๋™ ์„ค์ • ๋œ ๊ฒฝ์šฐ ์•ฑ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. test app์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ธ”๋Ÿฌ์ฒ˜๋ฆฌ ๋œ ์˜์ƒ์ž…๋‹ˆ๋‹ค.


์˜์ƒ์„ ๋ณด๋ฉด ํŒŒ์ผ ์‹คํ–‰ ์‹œ appium settings ์•ฑ์ด ๋จผ์ € ๋ฐ˜์ง ์‹คํ–‰๋˜๊ณ  ๊ทธ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘์„œ ์—†์ด ์ ์—ˆ์ง€๋งŒ, ๊ถ๊ธˆํ•˜์‹  ์  ์žˆ์œผ๋ฉด ํŽธํžˆ ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”

๋Œ“๊ธ€