Appium 이미지 인식 후 버튼 클릭 python (pyautoGUI)
문제되는 부분
모바일 자동화를 하게 된다면 마주하게 될 사항인 보안 영역입니다.
Inpector 를 통해서 Element 를 잡을 수는 있지만 로드가 될 때마다 패드 순서가 바뀌는 영역인데요.
이런 부분은 우리가 흔히 작성하는 방식인 Xpath 로는 알 수가 없습니다.
위의 화면을 봤을 때 Number Pad 중 숫자1을 선택해보았을 때의 화면인데요.
property 에서 해당 element가 숫자1이라는 것을 알수가 없습니다.
해결하는 방법
여러가지 방법이 있겠지만 저는 이미지를 인식해서 인식을 해보자라는 생각을 했습니다.
그래서 바로 찾아본 게 유명한 PyAutoGUI 라는 Library 를 이용해보았습니다.
제가 생각한 Flow 는 아래와 같습니다.
그리고 이것을 실행하기 위해 먼저 각각 선택할 이미지들을 캡쳐해둡니다.
이 이미지들과 실제 Appium이 돌아가고 있는 에뮬레이터의 버튼과 비교하여 클릭을 하는 겁니다.
먼저 아래 명령줄을 통해 pyautogui를 설치합니다.
pip3 install pyautogui
설치가 됐으면 아래 코드를 통해서 간단히 클릭을 해볼 수 있습니다.
import pyautogui
imgPath = 'Users/sunbae/Downloads/one.png'
btn = pyautogui.locateCenterOnScreen(imgPath, confidence=0.9)
pyautogui.click(btn)
아마도 위에 처럼하면 이미지를 못찾을 수 있습니다.
왜냐하면 90%의 정확도로 이미지를 찾아야 하는데 이미지에 색상과 값들이 다양하기 때문에
grayscale를 True로 설정하여 다시 비교하면 이미지를 찾을 수 있습니다.
btn = pyautogui.locateCenterOnScreen(imgPath, grayscale=True, confidence=0.9)
이미지를 찾을 수 있는 방법까지 왔으니 이제 구현해야할 것은 while문을 반복하며 이미지가 일치하지 않았을 때 정확도를 낮추면서 찾도록 구현합니다.
isSafe = False
acc = 0.9
while(True):
btn = pyautogui.locateCenterOnScreen(imgPath, grayscale=True, confidence=acc)
if btn is not None:
x,y = btn
x = x / 2
y = y / 2
pyautogui.click(x,y)
pyautogui.mouseDown()
pyautoguimouseUp()
isSafe = True
else:
acc -= 0.05
isSafe = False
if isSafe:
break
위와 같은 방식으로 구현을 하면 아래 처럼 동작하게 됩니다.