본문 바로가기
자동화(Automation)

Selenium_가상키보드 우회방법

by Testengineer 2024. 6. 22.
반응형

최근 결제 영역을 자동화를 처리하면서 새로운 문제에 도달했습니다.

바로 가상키보드때문에 카드번호나 비밀번호 값을 어떻게 입력해줘야 하는 부분이었습니다.

생각보다 가상키보드 영역을 자동화로 어떻게 풀어나가는지에 대한 문서가 많이 없는 것 같아, 이렇게 포스팅을 해보려고 합니다. 먼저, 가상키보드는 키보드 자판의 숫자나 문자의 위치가 열릴때마다 랜덤적으로 변경되는 특징을 가지고 있습니다. 이렇게 되다보니 처음 자동화를 구현하려고 할때, 원하는 키보드 포지션을 선택해서 매번 같은 결과가 나오게 하기 힘들었습니다.

 

그래서 시도해보면서 실패했던 경험담+완벽하진 않지만 해결했던 방법에 대해 공유드리고자 포스팅을 남깁니다!

 

가장 먼저 해봤던 방법은 가상키보드를 노출시키지 않고, "키패드에 있는 숫자를 입력해서 넣기"였습니다.

그래서 아래와 같은 1, 2번 방법을 시도해보았습니다.

1) 가상키보드를 display:none; 처리해서 띄우지 않고 카드번호를 입력해야 하는 영역에 sendKeys를 이용해서 값을 넣기

//카드번호 입력 
		WebElement cardno1 = driver.findElement(By.xpath("//input[@id='cardno1']"));
		wait.until(d -> cardno1.isDisplayed());
		cardno1.sendKeys("카드번호");

가상키보드를 노출시키지 않는데에는 성공했지만, element not interactable이라는 메시지가 뜨면서 자동화를 진행할 수 없었습니다...

 

2) javascript를 이용해서 값을 넣어주기

inputFieldId에 카드번호가 넣어질 영역을 valueToInput에 카드번호를 넣어주었습니다. 

((JavascriptExecutor) driver).executeScript("document.getElementById('" + inputFieldId + "').value = '" + valueToInput + "';");

이 방법은 inputFieldId 영역에 카드번호인 ValueToInput 값을 넣어주는데에는 성공했지만, 다음 페이지로 넘어가려고 하면 콘솔창에 에러(StringIndexOutOfBoundException)가 뜨면서 전산장애로 다음 과정으로 진행이 불가했습니다. 실제로 카드번호를 입력했을때는 해당 에러가 뜨지 않고 정상처리되나, 카드번호를 다 입력하고 다음페이지로 넘어가면 뜨기 때문에 에러의 원인을 명확하게 알기는 어려우나, 아마도 결제영역에서 자동화처리를 막으려고 되어있지 않나 싶은 추측이 들긴 했습니다;

 

앞선 두가지 방법을 모두 실패하고 더 이상 아이디어가 바닥나서 chatGPT에게 다른방법을 물어보았습니다. 현재 Eclipse(Java)+Selenium+TestNG를 이용해서 자동화를 진행하고 있기 때문에, 해당 환경에서 가능한 방법 중에 AutoIt, SikuliX를 추천해주었고, 저는 맥북/윈도우 모두 사용되는 환경을 원했기 때문에 SikuliX를 선택해서 진행했습니다.

 

SikuliX란?

화면의 이미지를 기반으로 GUI 요소를 인식하고 상호작용하는 자동화 도구입니다. Java로 작성되어 있으며, 스크린샷을 통해 특정 GUI 요소를 식별하고 그 요소를 클릭, 입력, 드래그 등의 작업을 수행할 수 있습니다. 

 

3) SikuliX를 이용해서 마우스로 저장된 캡처 이미지와 가장 유사한 이미지를 클릭하는 방법

사용방법은 간단합니다. 먼저 가상키보드에 있는 특정 버튼(숫자나 문자)를 캡처해서 파일로 저장해둡니다.

그리고 Eclipse에서 SikuliX 파일을 추가해준다음, 기본적인 코드를 입력해서 실행하면, 비슷한 이미지를 찾아 버튼을 클릭해줍니다.SikuliX 다운로드 : https://raiman.github.io/SikuliX1/downloads.html

import org.sikuli.script.Screen;
import org.sikuli.script.Pattern;
import org.sikuli.script.FindFailed;

public class Automation {
	public static void main(String[] args)throws FindFailed, InterruptedException{
		Screen screen = new Screen();
        
        // 클릭하고자 하는 버튼의 이미지를 Pattern으로 정의
        Pattern button = new Pattern("C:\\이미지 파일이 저장된 위치\\key1.png");
        
        try {
            // 버튼을 찾아 클릭
            screen.click(button);
            System.out.println("버튼 클릭 성공");
        } catch (FindFailed e) {
            e.printStackTrace();
            System.out.println("버튼을 찾지 못했습니다.");
        }
		
	}
}

이 방법으로 가상키보드를 클릭했을때 우선 또 다른 에러없이 다음과정까지 진행되는게 가장 큰 장점이었습니다. 다만, 이미지 인식률이 그렇게 훌륭하지 않습니다... 기본이 0.7이라고 하는데, 숫자를 제대로 인식하지 못해서 잘못된 카드번호 입력을 해서 번호입력에 실패하는 케이스도 굉장히 많았습니다. 그럴 때는, 유사도를 올리는 방법을 사용하시거나 캡처한 이미지 파일의 품질을 향상시키는 방법을 권해 드리고 싶습니다. 

//유사도를 95퍼까지 올리는 방법
Pattern key1 = new Pattern("이미지파일이 저장된 경로/key1.png").similar(0.95);

 

 

지금까지 사용했던 방법 중에 SikuliX가 그나마 가장 가상키보드를 우회할 수 있는 방법에 가까워서 진행중이긴 하지만, 인식률의 정확도가 그렇게 효율적이지 못해서 아쉬운 부분이 많습니다... 혹시나 다른 방법으로 성공해주신 분들이 있다면 공유 부탁드립니다!

반응형

'자동화(Automation)' 카테고리의 다른 글

Selenium_Button  (0) 2024.07.12
appium 자동화 Setting 2(Window환경)  (0) 2024.04.28
appium 자동화 Setting 1(Window 환경)  (1) 2024.03.31
Selenium_HttpUrlConnection  (0) 2022.09.16
Selenium_Window tab  (0) 2022.09.10

댓글