본문 바로가기

D.S/Python

210805목 - 셀레니움에서 file upload dialog box 다루는 방법

728x90

 

 

문제

보통 셀레니움으로 file upload를 할 때 input을 찾아서 send_keys로 경로를 전달한다. 하지만 직접적으로 file input을 못 찾을 경우는 이 방법으로는 불가능해서 다른 방법들이 있는지 찾게 되었다.

 

나 같은 경우 어떤 페이지에서 button input을 누르면 fileupload dialog가 뜨게 해 두고 file input은 찾을 수가 없었다. button을 클릭하고 send_keys()를 통해 파일 경로를 보내면 다이얼로그에 파일 경로를 전달을 안 하고 button element에 send_keys의 입력값을 전달하는 듯했다.

 

 

기본 조작

input="file"시에 보통 사용하는 방법이다. (나는 주로 xpath를 사용한다.)

driver.find_element_by_xpath("//input[@type='file']").send_keys("이미지경로")

 

 

해결 1 - pyautogui 사용

버튼을 누르면 file dialog의 경로 부분에 커서가 놓이는데 이때 pyautogui를 통해 파일 경로를 입력할 수 있다.

import pyperclip
import pyautogui


pyperclip.copy(img)

# gui로 다이얼로그 컨트롤
pyautogui.sleep(1)
pyautogui.hotkey("ctrl", "v") # 이건 딴데 클릭하면 망함..
pyautogui.sleep(1)
pyautogui.press('enter')

 

 

 

 

 

해결 2 - pywin32 사용

import win32com.client

shell = win32com.client.Dispatch("WScript.Shell")
shell.Sendkeys(img)
time.sleep(1)
shell.Sendkeys("{ENTER}")
time.sleep(1)

pywin32는 아나콘다를 사용하는 경우 pip 말고 conda install pywin32로 설치해줘야 한다. 그렇지 않으면 "win32com DLL load failed while importing win32api"가 생긴다. [참조]

 

*참고: dialog가 띄워졌을 때 내가 커서를 다른 데다 찍어버리면 dialog가 아닌 현재 커서가 놓인 곳에 파일 경로가 찍혀버린다.

 

해결 3 - pyautoit 사용

AutoIT라는 툴을 설치해서 fileupload를 다루는 건데 AutoIT exe 등등을 설치하고 이것저것 설정도 해줘야 해서 나중을 기약.. 참조만 달아놓겠다.

참조 1 : https://stackoverflow.com/questions/59803461/pyistaller-oserror-cannot-load-autoitx

참조 2 : How to use AutoIT with Selenium Webdriver: File Upload Example

 

 

참조

- https://www.py4u.net/discuss/12206 : 이곳에서 사용한 거의 모든 방법들은 위에서 설명한 방법들(pyautoit, pyautogiu, pywin32, 기본방법)을 이용함.

반응형