Python 에서 selenium 파일 업로드 모든 방법 정리

파일 업 로드 는 모든 UI 자동화 테스트 에서 직면 해 야 할 골 치 아 픈 문제 입 니 다.오늘 블 로 거들 은 이곳 에서 자신 이 파일 업 로드 를 처리 한 경험 을 공유 하고 파일 업로드 에 갇 힌 seleniumer 에 도움 이 되 기 를 바 랍 니 다.
우선,업로드 단추 의 종 류 를 구분 해 야 합 니 다.대체적으로 두 가지 로 나 눌 수 있 습 니 다.하 나 는 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 차원 의 조작 으로 처리 하 죠.여기까지 우 리 는 기본적으로 문제 의 처리 방법 을 찾 았 습 니 다.
대체적으로 다음 과 같은 몇 가지 해결 방안 이 있다.
  • autoIT 는 외부의 힘 을 빌려 생 성 된 au3 또는 exe 파일 을 호출 합 니 다.
  • Python pywin 32 라 이브 러 리,대화 상자 핸들 인식,더 나 아가 조작
  • SendKeys 라 이브 러 리
  • keybd_이벤트,3 과 유사 합 니 다.아 날로 그 버튼,ctrl+a,ctrl+c,ctrl+v..
  • 현재 저 는 상기 네 가지 방법 만 알 고 있 습 니 다.다른 방법 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.저 에 게 공 부 를 하 게 해 주세요.
    우리 차례대로 봅 시다.
    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):
  • 맨 위 창 에서 조건 에 맞 는 창 을 찾 고 이 창의 핸들 을 되 돌려 줍 니 다.
  • lpClassName:클래스 이름,Spy+에서 볼 수 있 습 니 다
  • lpWindow Name:창 이름,제목 표시 줄 에 보 이 는 이름
  • 코드 예제 에서 우 리 는 업로드 창 을 찾 는 데 사 용 됩 니 다.그 중 하나 만 사용 할 수 있 습 니 다.classname 으로 포 지 셔 닝 하면 다른 것 에 의 해 방 해 될 수 있 습 니 다.windowname 으로 위치 가 불안정 하고 서로 다른 업로드 대화 상 자 는 windowname 이 다 릅 니 다.어떻게 포 지 셔 닝 하 느 냐 는 당신 의 상황 에 달 려 있 습 니 다.
  • win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
  • 클래스 이름과 창 이름 이 일치 하 는 창 을 검색 하고 이 창의 핸들 을 되 돌려 줍 니 다.찾 지 못 하면 0 으로 돌아 갑 니 다.4567918)
  • hwndParent:0 이 아니라면 hwndParent 창의 하위 창 을 검색 합 니 다.
  • hwnd Child After:0 이 아니라면 z-index 순서대로 hwnd Child After 에서 뒤쪽 으로 하위 창 을 검색 합 니 다.그렇지 않 으 면 첫 번 째 창 부터 검색 합 니 다.
  • lpClassName:문자 형,창의 클래스 입 니 다.이것 은 Spy+에서 찾 을 수 있 습 니 다.
  • lpWindow Name:문자 형,창 이름,즉 제목 표시 줄 에서 볼 수 있 는 제목 입 니 다.
  • 코드 예제 에서 우 리 는 입력 상자 와 확인 단 추 를 층 층 이 찾 는 데 사용 된다.
  • win32gui.SendMessage(hWnd, Msg, wParam, lParam)
  • hwnd:정형,메 시 지 를 받 는 창 핸들
  • Msg:정형,보 낼 메시지,이 메시지 들 은 모두 windows 가 미리 정 의 된 것 입 니 다.시스템 정의 메시지(System-Defined Messages)
  • 를 참조 할 수 있 습 니 다.
  • wParam:정형,메시지 의 wParam 매개 변수
  • lParam:정형,메시지 의 lParam 매개 변수
  • 코드 예제 에서 우 리 는 입력 상자 에 파일 주 소 를 입력 하고 확인 단 추 를 누 르 는 데 사용 된다
  • .
    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 도 가능 합 니 다.관심 있 으 면 직접 해 보 세 요.
    그리고 우 리 는 위의 이 창의 코드 가 이전 예제 의 기본 과 같다 는 것 을 발견 할 수 있 습 니 다.이것 은 우리 가 업로드 한 부분 을 추출 하고 함 수 를 쓸 수 있다 는 것 을 설명 합 니 다.이렇게 매번 업로드 할 때마다 함 수 를 직접 호출 하고 인 자 를 입력 하면 됩 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기