문제
보통 셀레니움으로 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, 기본방법)을 이용함.