-
Python Selenium autoit을 사용한 파일 업로드창 제어Language/Python 2021. 12. 28. 01:00
보통 python selenium(이하 셀레니움)을 통해서 웹브라우저를 동적으로 제어하곤 한다.
이번에는 그 중에서도 파일 업로드 창을 제어하는 부분에 대해서 알아본다.
기본적으로 셀레니움은 다음과 같은 파일 업로드 창을 제어할 수 없다.
아 물론 autoit이라는 모듈을 사용해서 업로드 제어가 가능하다.
하지만 이번 상황에서는 pycharm과 같은 툴에서 동작하는 것이 아닌 exe파일로 변환하였을 때 autoit이 제대로 실행되지 않기 때문에 제어가 안된다고 하는 것이다.
이 포스팅의 목적은 이 부분이 아니라 이 코드가 삽입된 파이썬 파일을 실행파일(exe)파일로 변환하였을 때 생기는 이슈를 해결하고자 한다.
그럼 우선 ide같은 툴에서 실행하도록 하는 방식을 알아보자.
import autoit # Basic Window info 값 handle 변수에 저장 handle = "[CLASS:#32770; TITLE:열기]" # 이름이 '열기'인 창이 나올 때까지 3초간 대기 autoit.win_wait_active("열기", 3) # 사진 클릭시 나오는 윈도우 창에서 파일이름 경로값 전달 path = os.getcwd() + "\\메인이미지.jpg" autoit.control_set_text(handle, "Edit1", path) # 사진 클릭시 나오는 윈도우 창에서 Button1 클릭 autoit.control_click(handle, "Button1")
이런 코드를 가지고 있는 파이썬 파일을 실행파일로 변환하고자 하면 다음과 같은 명령어를 실행하여야 한다.
pyinstaller -w -F [파일명]
pyinstaller라는 모듈을 설치하고 터미널에서 pyinstaller app.py(파일명)을 치면 된다.
자주 사용하는 두가지 옵션에 대해서 설명하자면 -w, --windowed, --noconsole는 콘솔 윈도우를 표시하지 않는 것이고, -F, --onefile는 1개의 실행파일로 만드는 옵션이다.
이렇게 생성된 exe파일을 실행해보면.. 다음과 같은 에러가 뜬다..
에러에 가장 중요한 부분은 마지막 부분이다. OSError: Cannot load AutoItX from path: C:\Users\AppData\Local\Temp\_MEI\autoit\lib\AutoItX3_x64.dll
autoit 라이브러리를 로드하지 못했다는 것인데 에러 내용을 상세히 보면 Temp파일 안에 속해있는 것을 알 수 있다.
이 부분을 한참 헤맸는데 결론은 exe파일을 실행할때 생기고 없어지는 임시파일이므로 그냥 무시하면 된다.
관련 부분에 대하여 stackoverflow를 찾아보면 다음과 같다.
Autoit Pyinstaller OSError: Cannot load AutoItX from path: C:\Users\AppData\Local\Temp\_MEI74002\autoit\lib\AutoItX3_x64.dll
I'm trying to change my .py file to .exe however I get the above error when I try to run it. It seems to compile fine with Pyinstaller. I used pyinstaller filename.spec -F -i "pic.ico" my filename....
stackoverflow.com
좀 읽어보면 경로를 바꾸라고 하는데 이런 방식으로는 해결할 수 없다. 한참을 찾다가 얻어낸 결론은 다음과 같다.
다음 사이트에서 아주 상세한 내용을 설명하고 있는 데 autoit은 autoit script로 작성하여 컴파일하면 exe파일이 되는데 이를 파이썬에서 사용해야 된다는 것이다. 아래의 긴 설명은 이 guru99에 나와있는 사이트를 좀 더 보완하여 제작한 부분이다. 함께 보면 좋을 것 같다 :)
https://www.guru99.com/use-autoit-selenium.html
How to use AutoIT with Selenium Webdriver: File Upload Example
In this Tutorial, How to AutoIT download and install, Write Script, Hoe to use, and How AutoIT Upload file in Selenium Webdriver.
www.guru99.com
영어를 보기 싫은 분들을 위해 설명해본다..
1. 사이트에서 autoit 파일을 받는다. (혹시라도 해당 링크가 없어진다면 https://www.autoitscript.com/site/autoit/downloads/ 여기에서 다시 받아보시면 됩니다)
-> 다운로드 : https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe
2. 다음으로는 autoit script editor를 받아야한다.
-> 다운로드 : https://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe
3. 두 개를 받아서 실행해준다. Au3info.exe파일은 파일 업로드 창에 정보를 받아올수 있는 프로그램이고
SciTE.exe파일은 스크립트 에디터다.
https://www.guru99.com/use-autoit-selenium.html 4. 위 캡쳐는 guru99 설명에 나온 부분이고 실제로 autoit을 실행해보면 다음과 같은 프로그램이 뜬다.
여기서 중요한 부분은 Finder Tool부분이다.
5. guru99 설명에 사진으로 보면 우선 파일업로드 창을 띄우고 Finder Tool 아래 부분에 있는 아이콘을 끌어당기면 file name에 해당하는 부분이 Basic Control Info부분에 적히게 된다.
아래 사진은 직접 해본 부분이다. Finder Tool 아이콘을 드래그하면 파일 이름 부분이 검정색 박스로 변하게 된다.
그리고 Basic Control Info부분에 Class 값에는 Edit이라는 값이 들어오고 Instance부분에는 1이 나온다.
이 Edit이라는 부분과 1이라는 부분이 선택한 부분에 대한 값이라고 보면 된다. 그리고 Title은 그냥 창 이름이라고 보면 된다.
6. 다음으로 SciTe 스크립트 에디터를 열어 다음과 같이 작성한다.
ControlFocus("열기","text","Edit1") ControlSetText("열기","","Edit1",ClipGet()) ControlClick("열기","","Button1")
한줄씩 설명해보면 다음과 같다.
가. 열기라는 이름의 파일 업로드 창에서 파일 이름에 포커스를 둔다. 파일 이름은 Edit1이라는 값이다.
나. 열기라는 이름의 파일 업로드 창에서 text를 가져와 입력한다.
다. 열기라는 이름의 파일 업로드 창에서 열기 버튼을 누른다.
메소드에 대해서 설명하자면 다음과 같다.
- ControlFocus// 입력 포커스를 창의 지정된 컨트롤에 설정합니다.
(" title "," text ",controlID ) - ControlSetText// 컨트롤의 텍스트를 설정합니다.
(" title "," text ",controlID ," 업로드해야 하는 파일 경로 " ) - ControlClick// 주어진 컨트롤에 마우스 클릭 명령을 보냅니다.
(" title "," text ",controlID )
특이사항으로는 guru99 설명 글을 보면 위에 코드 중 2번째줄 ControlSetText 마지막 파라미터에 업로드 해야하는 파일 경로가 하드코딩 되어있다. 그런데 위에 코드는 ClipGet()이라는 메소드를 사용한다. 이 부분은 클립보드에 저장된 값을 가져오는 부분이다. 이 부분은 나중에 이렇게 작성한 이유는 autoit을 exe파일로 변환하여야 하기 때문에 하드코딩을 하면 안되기 때문이다. 항상 같은 파일을 업로드하는 동작이라면 하드코딩을 해도 된다.
7. 3줄 작성한 스크립트 파일을 저장하고 해당 스크립트 파일 위에서 오른쪽 클릭을 하면 다음과 같이 뜬다.
이제 저기서 Compile Script를 하게 되면 exe파일이 생성이 된다.
이제 파일업로드 창을 띄운 상태에서 스크립트를 컴파일한 FileUpload.exe파일을 실행하면 파일이 자동으로 올라가는 것을 알 수 있다!!
파일 업로드는 다른 아무 사이트나 되지만 guru99에 있는 파일업로드에서 테스트 해볼수 있다. 이름과 이메일 주소를 대략적으로 입력하면 아래와 같은 파일업로드가 뜨니 참고하시길.. (네이버나 다른 사이트에서 사용 가능하다)
https://www.guru99.com/become-an-instructor
8. 자 이제 autoit을 사용한 파일업로드 제어 실행파일(exe)을 만들었다. 이를 이제 파이썬에서 사용하기만 하면 된다!!
import os os.system(os.getcwd() + "/FileUpload.exe")
아까보다 굉장히 심플하다. 이미 실행파일을 만들었으니 단순히 사용하기만 하면 된다! 이런식으로 진행할 경우 아까와 같이 경로를 못 찾는 부분이 말끔히 해결된다! 끗 :)
- ControlFocus// 입력 포커스를 창의 지정된 컨트롤에 설정합니다.