don't stop believing

Interacting with the User 본문

Testing Automation/SikuliX

Interacting with the User

Tongchun 2018. 1. 16. 10:27

Sikuli에서는 popup 등을 통해 사용자와 인터렉션을 할수 있습니다.

  • popup()
  • popError()
  • popAsk()
  • input()
  • inputText()
  • select()

하나씩 확인해 봅시다.


먼저 popat()입니다.

popat()은 메시지 창을 띄우는 위치를 지정하게 됩니다. 이미지 매칭을 통해 프로그램이 구동되기 때문에 화면의 팝업 위치를 잡아줘야 할 때가 있습니다. 간혹 찾으려는 위치 위에 팝업이 떠 이미지를 가리는 경우가 발생하기도 합니다.

사용법은 popat(<x좌표>, <y좌표>)로 사용하면 됩니다.

저는 보통 popat(200, 100)으로 합니다. 그러면 화면의 왼쪽 위에 팝업이 뜨게 됩니다.


팝업이 뜨는 위치를 잡았으니 뭐라도 띄워봐야겠죠.

popup() 함수를 써봅시다. popup 함수는 popup(<내용>, <상단 타이틀>)로 구성됩니다. 일단 써봅시다.

먼저 popat(200, 100) 잡아놓고 popup("안녕하세요. sikuli를 배워봅시다.", "타이틀") 이렇게 작성합니다.


그리고 실행해 보면 왼쪽 상단에 팝업이 뜨는걸 확인할 수 있습니다. 그러나 우리의 예상과는 뭔가 달라 보입니다.

한글이 다 깨지네요.

Python에서는 언어에 대한 encoding을 처리해 줘야 합니다. Python에서 문자 타입의 기본은 ascii 형태입니다. 한글을 표현하려면 utf-8로 바꿔줘야 합니다.

그래서 다시 아래와 같이 작성합니다.

message라는 변수를 선언하고 한글로 내용을 써줍니다. title 변수도 선언합니다.

그리고 message라는 변수에 등록된 한글을 python이 알수 있도록 decode('utf-8')을 사용해 변환해 줍니다.

다시 실행하면 한글이 보일겁니다.


내용을 두 줄로 쓰고 싶다면 \n을 추가하면 됩니다. \n은 줄내림 입니다.

실행하면 이쁘게 두 줄로 내용이 보입니다.

실행하면 아래처럼 두 줄로 메시지가 보입니다.


이번엔 popError()함수를 확인해 보겠습니다. 사용법은 popup과 동일합니다.

popError("<에러 내용>", "<에러 타이틀>")

팝업 이미지로 X 표도 나오네요.

이번에는 popup을 이용해 Yes 또는 No에 대한 질문을 하는 기능입니다.

어떤 질문(상황)에 대해 맞는 것인지, 아닌 것인지를 유저에게 묻는 경우에 사용됩니다.

popAsk() 함수 입니다. popAsk()함수의 파라메타는 popup과 popError와 같습니다. popAsk("<질문 내용>", "<팝업 타이틀>")로 사용하면 됩니다. 질문에 대한 답을 받으려면 변수를 사용해야 합니다.


answer = popAsk(message.decode('utf-8'), title.decode('utf-8'))

popAsk의 결과를 받기 위해 answer라는 변수를 사용했습니다 popAsk()로 띄운 메시지에 예, 또는 아니오를 클릭하면 answer 변수에는 True 또는 False의 결과값을 전달받게 됩니다.

그것을 if else 문을 사용해 대답에 대한 반응을 해주면 됩니다.


if answer: 구문은 "만약 answer가 True라면" 입니다.

else: 구문은 "그렇지 않다면" 입니다.


위 내용을 실행하면 아래처럼 팝업이 띄워집니다.

예, 아니오에 대한 대답을 구하게 됩니다. 예를 클릭하면 스크립트에서 처럼 팝업이 뜨게 됩니다.

이렇게 popAsk()함수로 스크립트 실행을 구분지어 줄수 있습니다.


이번에는 True, False가 아닌 텍스트를 입력해 봅니다. input() 함수입니다.

input() 함수의 파라메타는 차래대로 아래와 같습니다.

  • message: 질문 내용입니다.
  • default: input 박스안에 쓰여질 문구입니다.
  • title: popup창의 타이틀입니다.
  • hidden: input 박스안에 글을 입력할때 별표로 처리되는지에 대한 여부입니다. 기본으로 false로 되어 있고 사용하지 않을 경우 입력하지 않아도 됩니다.

input("<message>", "<default>", "<title>", hidden = false)


이름과 비밀번호를 묻는것을 가정하여 작성해 보겠습니다.

input()함수에 대한 결과값을 name이라는 변수로 받습니다.

그리고 동일하게 password라는 변수로 input()함수의 값을 받습니다.

Python에서 두 개의 String 타입은 + 로 결합할 수 있습니다. password의 input() 파라메타에 사용할 message 변수에는 name + "님 비번을 입력하세요."로 작성되어 있으며 name의 데이터 타입은 String입니다.

실행하면 아래와 같이 팝업이 띄워집니다.

input 박스에 nGle이 아니라 저는 김동춘이라고 한글로 입력하겠습니다. 그리고 [확인]을 클릭하면 에러가 납니다.

name 변수에 input()함수의 값이 잘 받아졌는지 print로 확인하려고 했는데 그 부분에서 에러가 났습니다.

[error] script [ Conditional ] stopped with error in line 6

[error] UnicodeEncodeError ( 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) )

두 번째 에러 줄에 ascii 코덱이 encode할 수 없다고 나오네요.

Python이 알수 있도록 decode('utf-8')을 해줬던 것 처럼 사람이 확인하기 위해 encode('utf-8')로 처리해 줘야 합니다.

에러난 print name을 print name.encode('utf-8')로 수정하고 다시 실행해 줍니다.

그리고 한글로 이름을 작성하면 아래 처럼 password를 묻는 팝업창이 나오게 됩니다.

password input()함수의 파라메타 중 hidden = True로 되어있어 입력되 내용이 보이지 않고 있습니다.

message = name + "님 비번을 입력하세요.".decode('utf-8') 이 부분도 잘 처리되서 나오네요.


에러가 났던 print name.encode('utf-8')도 잘 보이고 있습니다.


이번에는 inputText()함수입니다. 한줄짜리 입력이 아닌 여러줄로된 장문의 글을 입력받고 싶을때 사용합니다.

inputText()에서 사용하는 파라메터는 아래와 같습니다.

  • message: 입력하려는 글에 대한 설명 문구
  • title: 팝업창의 타이틀
  • lines: 입력란의 줄 수 (기본 9줄)
  • width: 입력란의 넓기 (기본 20자)

inputText("<message>", "<title>", lines=9, width=20)

먼저 lines와 width는 기본값이 정해져 있어서 파라메터를 추가하지 않고 작성해 보겠습니다.

inputText()의 값을 받기위해 story라는 변수를 지정했습니다.

실행하면 입력란이 큰 팝업창이 뜨게 됩니다. 엔터를 입력하며 여러줄의 글을 작성하고 [확인] 버튼을 클릭합니다.

       

그럼 print story.encode('utf-8')를 통해 Sikuli IED 메시지 창에 작성한 글이 보입니다.


마지막으로 select()함수 입니다. popAsk()처럼 유저에게 선택하고 싶을때 select()함수를 사용합니다.

popAsk()는 예, 아니오 두 가지의 결과값만 받을 수 있었다면 select()는 여러개의 선택항목을 제시하고 그 결과값을 받아올 수 있습니다.

select()함수에 입력되는 파마메타 입니다.

  • message: 설명 문구
  • title: 팝업창의 타이틀
  • options: 선택항목 입니다.
  • default: 선택항목 중 기본으로 선택되어지는 값입니다. (기본 첫 번째 option)

유저에게 몇층에서 근무하는지 물어보고 답변을 하는 예제입니다.

items 변수를 선언하고 선택하게 할 조건을 배열로 선언합니다. 이때 배열안에 한글이 있다면 decode('utf-8')을 해줘야 합니다.

selected라는 변수를 선언하고 select()함수의 리턴값을 받아옵니다.

그리고 if elif else문을 사용해 해당하는 답변을 해주게 됩니다. 이때 item 변수에 들어간 값은 배열이기 때문에 변수[배열 자릿수]로 배열의 값을 선택하게 해 줄수 있습니다.

실행하며 아래처럼 팝업이 나타납니다.

저는 3층을 선택했습니다.

select()함수 설명을 위한 스크립트에 exit(1)이 있는데 처음 추가된 내용이네요. exit(1)은 스크립트를 종료시키는 명령입니다.


여기까지 기본 유저 인터랙션을 위한 팝업기능이었습니다.


참고 : http://sikulix-2014.readthedocs.io/en/latest/interaction.html


Comments