2012-11-06 4 views
2

PyQt4의 QWebView를 사용하여 웹 사이트로 파일 업로드를 자동화하고 싶지만 아직 이해할 수없는 부분이 있습니다. 파일을 업로드하기 위해 웹 사이트에는 로컬 파일을 선택해야하는 대화 상자가 열리는 단추가 있습니다. 그래서, 내 질문이 있습니다 :) 버튼을 클릭하면 대화 상자를 제어하는 ​​방법이 있습니까? 이것을 달성하기위한 더 좋은 방법이 있습니까?Qt : 시스템 열린 파일 대화 상자를 인계받습니다.

편집

웹 사이트는 https://maps.google.com/ 내가이 내 위치를 통해 .KML 파일을 업로드하고있어>지도> 가져 오기을 만듭니다.

+0

당신이 웹 사이트의 URL을 제공 할 수있다 : 여기

더 많거나 적은 기본 구현을 재현 테스트 순수한 PyQt4 데모입니까? – enginefree

+0

@enginefree 확실하게 게시물을 편집합니다 –

+0

내가 제공 한 답변이 작동 했습니까? – enginefree

답변

4

당신이 찾고있는 것이 QWebPage::chooseFile() 일 수 있습니다 (웹 사이트가 어떻게 처리하는지에 따라 달라질 수 있습니다). 그것을 다시 구현하고 그것이 충분한 지 확인하십시오. 원하는 파일을 선택하고 선택한 파일 경로를 반환하십시오.

편집 : 이제 테스트 한 링크를 제공하고 작동하는 것으로 보입니다.

+0

감사합니다. 나는 미래에 문서를주의 깊게 읽어야한다고 생각합니다. :) –

1

좋아, 배경 정보 및 참조부터 시작하자.

사용할 모듈은 pywin32이고 다운로드는 here이며, 구체적으로는 win32gui 인 API 참조 here입니다.

는 당신이 창 핸들에 "이동"할 수있는 대화 상자를 조작 할 수 있습니다 전에 자, 다음은 두 개의 입력이 경우 #32770lpclassName을 곳이처럼 보인다 win32.FindWindow API 참조 here를 사용

의 (a 의미

import win32gui 

control = win32gui.FindWindow("#32770", "File Upload") 
,536 : 대화) 참조 here이 경우 File UploadlpWindowName,

HWND WINAPI FindWindow(
    _In_opt_ LPCTSTR lpClassName, 
    _In_opt_ LPCTSTR lpWindowName 
); 

코드는 파일 핸들을 찾습니다

그리고 핸들을 저장합니다. 내 경우에는 721470입니다.

다음 단계는 대화 상자에서 GUI 개체의 핸들을 찾습니다. Cancel 단추의 예를 보여줍니다. 핸들을 찾으려면, 나는 SendMessage에 대한 BM_CLICKhere에 대한 참조 here 여기 FindWindowEx API 참조,

import win32con 
import win32api 

ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel"); 
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0) 

을 사용 줘야 해.

최종 코드 :

import win32gui 
import win32api 
import win32con 

window = win32gui.GetForegroundWindow() 
title = win32gui.GetWindowText(window) 
control = win32gui.FindWindow("#32770", "File Upload") 
ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel") 
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0) 

또 다른 방법은 아래의 watsup.winGuiAuto 모듈, here, 예를 사용하는 것입니다

from watsup.winGuiAuto import * 

optDialog = findTopWindow(wantedText="File Upload") 

CancelButton = findControl(optDialog,wantedClass="Button", wantedText="Cancel") 

clickButton(SaveButton) 

을하지만 난이 가장 쉬운 방법은 autoithere를 사용하는 것입니다 생각, 내가 사용하고 있습니다 전에 pyqt에서, 명령을 쏴.

희망이 도움이됩니다.

추가 참조 (pywin32 버전) :

win32guihere

win32apihere

1

나는 @LucaCarlon에 의해 주어진 솔루션은 바로 하나이며, 보너스를받을 자격 생각합니다.

import sys 
from PyQt4 import QtCore, QtGui, QtWebKit 

class WebPage(QtWebKit.QWebPage): 
    def chooseFile(self, frame=None, path=''): 
     return QtGui.QFileDialog.getOpenFileName(self.parent(), '', path) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    view = QtWebKit.QWebView() 
    view.setPage(WebPage(view)) 
    view.load(QtCore.QUrl('https://maps.google.com/')) 
    view.show() 
    sys.exit(app.exec_()) 
+0

시험에 감사 드리며 LucaCarlon의 답변을 수락하고 보너스로 고려해 보겠습니다. –

관련 문제