2022. 10. 6. 18:08ㆍQA

문제되는 부분
모바일 자동화를 하게 된다면 마주하게 될 사항인 보안 영역입니다.
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
위와 같은 방식으로 구현을 하면 아래 처럼 동작하게 됩니다.

'QA' 카테고리의 다른 글
[QA] NotionAPI to SlackAPI 긁어서 파이썬으로 슬랙 주기적으로 보내기 with PythonAnywhere (0) | 2023.06.29 |
---|---|
(QA) AWS Device Farm Python을 이용하여 Appium 원격 자동화 (0) | 2022.09.20 |
[MacOS] Appium 기본 환경설정 (0) | 2022.09.13 |
셀레니움 화면에 찾는게 있는지 없는지 체크하는 법 (how to check element is present or not in selenium) (0) | 2022.09.06 |
C# 원하는 비율대로 특정 문자를 배치하기 (0) | 2021.10.21 |