Python 에서 selenium 파일 업로드 모든 방법 정리
우선,업로드 단추 의 종 류 를 구분 해 야 합 니 다.대체적으로 두 가지 로 나 눌 수 있 습 니 다.하 나 는 input 상자 이 고 다른 하 나 는 복잡 합 니 다.js,flash 등 을 통 해 이 루어 집 니 다.라벨 은 input 이 아 닙 니 다.
우 리 는 각각 이 두 가 지 를 분석 했다.
1.input 태그
알다 시 피 input 라벨 은 직접 sendkeys 의,여기 도 예외 가 아 닙 니 다.코드 예 시 를 보십시오.
코드:
# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = driver.find_element_by_id('file')
upload.send_keys('d:\\baidu.py') # send_keys
print upload.get_attribute('value') # check value
driver.quit()
결과:baidu.py
분명히 input 업로드 에 대해 서 는 직접 sendkeys 는 가장 간단 한 해결 방안 이다.
2.비 input 형 업로드
다음은 난이도 가 업그레이드 되 어야 합 니 다.input 상자 가 아 닌 업로드 에 대해 서 는 어떻게 해 야 합 니까?이런 업로드 가 기괴 하고 a 태그 가 있 는,div 가 있 는,button 이 있 는,object 가 있 는,우 리 는 웹 페이지 에서 이 업 로드 를 직접 처리 할 방법 이 없습니다.유일한 방법 은 OS 탄 상 자 를 열 어 탄 상 자 를 처리 하 는 것 입 니 다.
문제 가 또 생 겼 다.OS 탄 틀 과 관련 된 차원 은 이미 selenium 이 해결 할 수 있 는 것 이 아니다.어 떡 하지?아주 간단 합 니 다.OS 차원 의 조작 으로 처리 하 죠.여기까지 우 리 는 기본적으로 문제 의 처리 방법 을 찾 았 습 니 다.
대체적으로 다음 과 같은 몇 가지 해결 방안 이 있다.
우리 차례대로 봅 시다.
1. autoIT
autoIT 업로드 및 매개 변수 화 방법 에 대해 서 는 다른 블 로그 에서 말씀 드 렸 습 니 다.selenium 의 autoit 명령 행 인 자 를 참조 하 십시오.여 기 는 더 이상 군말 하지 않 겠 다.
2.win32gui
잔말 말고 코드 를 먼저 입력 하 세 요.
코드:
# -*- coding: utf-8 -*-
from selenium import webdriver
import win32gui
import win32con
import time
dr = webdriver.Firefox()
dr.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = dr.find_element_by_id('file')
upload.click()
time.sleep(1)
# win32gui
dialog = win32gui.FindWindow('#32770', u' ') #
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # , Edit
button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # Button
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd:\\baidu.py') #
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # button
print upload.get_attribute('value')
dr.quit()
결과:baidu.py
여기 서 당신 은 매우 중요 한 작은 도구 가 필요 합 니 다.Spy+,바 이 두 는 여러 가지 가 있 습 니 다.물론 당신 도 autoIT 가 가지 고 있 는 도 구 를 사용 할 수 있 지만 이것 이 좋 지 않 습 니 다.다음 에 가 는 것 을 권장 합 니 다.
그리고 pywin 32 라 이브 러 리 를 설치 해 야 합 니 다.Python 버 전에 대응 하 는 라 이브 러 리 를 찾 을 수 있 습 니 다.32 비트 인지 64 비트 인지 설치 한 Python 버 전과 대응 해 야 합 니 다.
설치 가 완료 되면[시작 메뉴 Python 의 폴 더]에서 PyWin 32 의 문 서 를 볼 수 있 습 니 다.[Python for Windows Documentation]에서 해당 하 는 방법 API 를 찾 을 수 있 습 니 다.
간단하게 몇 가 지 를 소개 하 는데 쓰 이 는 것:
win32gui.FindWindow(lpClassName=None, lpWindowName=None):
win32api 모듈 및 기타 방법 에 대해 서 는 더 이상 설명 하지 않 고 알 고 싶 은 자체 바 이 두 나 pywin 32 문 서 를 봅 니 다.
3.SendKeys
먼저 SendKeys 라 이브 러 리 를 설치 해 야 합 니 다.pip 로 설치 할 수 있 습 니 다.
pip install SendKeys코드 예제:
# -*- coding: utf-8 -*-
from selenium import webdriver
import win32gui
import win32con
import time
dr = webdriver.Firefox()
dr.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = dr.find_element_by_id('file')
upload.click()
time.sleep(1)
# SendKeys
SendKeys.SendKeys('D:\\baidu.py') #
SendKeys.SendKeys("{ENTER}") #
print upload.get_attribute('value')
dr.quit()
결과:baidu.py
SendKeys 라 이브 러 리 를 통 해 직접 초점 에 정 보 를 입력 할 수 있 습 니 다.그러나 창 을 열 때 대기 시간 을 약간 더 해 야 합 니 다.그렇지 않 으 면 첫 번 째 자모 send 가 들 어가 지 않 거나 주소 전에 쓸모없는 문 자 를 추가 할 수 있 습 니 다.그러나 저 는 이런 방법 이 매우 불안정 하고 추천 하지 않 습 니 다.
4.keybd_event
win32api 는 keybd 를 제공 합 니 다.이벤트()방법 은 버튼 을 모 의 하 는 것 이지 만 이 방법 은 비교적 번 거 롭 고 불안정 하기 때문에 추천 하지 않 습 니 다.다음은 일부 코드 예 시 를 드 리 겠 습 니 다.연구 하고 싶 으 면 바 이 두 에서 공부 하 세 요.
...
# input , ,
video.send_keys('C:\\Users\\Administrator\\Pictures\\04b20919fc78baf41fc993fd8ee2c5c9.jpg')
video.send_keys(Keys.CONTROL, 'a') # selenium send_keys(ctrl+a)
video.send_keys(Keys.CONTROL, 'x') # (ctrl+x)
driver.find_element_by_id('uploadImage').click() # ,
# (ctrl + v)
win32api.keybd_event(17, 0, 0, 0) # ctrl
win32api.keybd_event(86, 0, 0, 0) # v
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) # v
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # ctrl
time.sleep(1)
# (enter)
win32api.keybd_event(13, 0, 0, 0) # enter
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # enter
...
귀 찮 지 않 습 니까?물론 버튼 으로 전체 경 로 를 입력 할 수도 있 습 니 다.하지만 아무 도 그 러 고 싶 어 하지 않 을 것 같 습 니 다.그리고 이 과정 에서 마 우 스 를 마음대로 움 직 일 수 없고 클립보드 를 사용 할 수 없어 불안정 하기 때문에 이런 방법 을 사용 하 는 것 을 권장 하지 않 는 다.3.다 중 파일 업로드
다음은 다 중 파일 업로드 라 는 점 을 고려 해 볼 만하 다.여러 파일 을 어떻게 업로드 하 는 지,물론 우 리 는 입력 상자 에 파일 경 로 를 입력 해 야 하기 때문에 유일 하 게 알 아야 할 것 은 여러 파일 을 업로드 할 때 파일 경 로 를 어떻게 쓰 는 지 하 는 것 입 니 다.
내 가 알려 줄 게.다 중 파일 업 로드 는 파일 경로 상자 에서 하나의 경 로 를 따옴표 로 묶 은 다음 에 쉼표 로 여러 경 로 를 구분 하 는 것 이 이렇게 간단 하 다.예 를 들 어:
“D:\a.txt” “D:\b.txt”
그러나 주의해 야 할 것 은 여러 개의 파일 이 같은 경로 에서 만 이렇게 사용 할 수 있 습 니 다.그렇지 않 으 면 실패 할 수 있 습 니 다.(아래 의 쓰기 방법 은 안 됩 니 다)
“C:\a.txt” “D:\b.txt”
다음 에 예 를 찾 아 보 세 요.
코드:
# -*- coding: utf-8 -*-
from selenium import webdriver
import win32gui
import win32con
import time
dr = webdriver.Firefox()
dr.get('http://www.sucaijiayuan.com/api/demo.php?url=/demo/20150128-1')
dr.switch_to.frame('iframe') # frame
dr.find_element_by_class_name('filePicker').click()
time.sleep(1)
dialog = win32gui.FindWindow('#32770', None)
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
button = win32gui.FindWindowEx(dialog, 0, 'Button', None)
# , ,
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, '"d:\\baidu.py" "d:\\upload.py" "d:\\1.html"')
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
print dr.find_element_by_id('status_info').text
dr.quit()
결과:파일 3 장,총 1.17KB 를 선택 하 십시오.
이 를 통 해 알 수 있 듯 이 다 중 파일 업로드 가 그렇게 복잡 하지 도 않 고 간단 하 다.유일한 차이 점 은 입력 한 매개 변수 가 다 를 뿐이다.autoIT 도 가능 합 니 다.관심 있 으 면 직접 해 보 세 요.
그리고 우 리 는 위의 이 창의 코드 가 이전 예제 의 기본 과 같다 는 것 을 발견 할 수 있 습 니 다.이것 은 우리 가 업로드 한 부분 을 추출 하고 함 수 를 쓸 수 있다 는 것 을 설명 합 니 다.이렇게 매번 업로드 할 때마다 함 수 를 직접 호출 하고 인 자 를 입력 하면 됩 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WDM(WebDriverManager) 시작하기자동화 테스트(브라우저 자동화)에 대해 이야기할 때마다 몇 가지 사항이 있어야 합니다. 브라우저(시스템 경로에 있어야 함). 드라이버 실행 파일(시스템 경로에 있어야 함), 드라이버 실행 파일 버전은 브라우저 버전과...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.