2

PyQt4のQWebViewを使ってWebサイトへのファイルアップロードを自動化したいのですが、まだ分からないところがあります。ファイルをアップロードするために、Web サイトにはボタンがあり、ローカル ファイルを選択するためのダイアログが開きます。それで、これらは私の質問です:) ボタンをクリックすると、そのダイアログを制御する方法はありますか? これを達成するためのより良い方法はありますか?

編集

ウェブサイトはhttps://maps.google.com/で、 My Places > Create Map > Importから .kml ファイルをアップロードしています。

4

3 に答える 3

4

あなたが探しているのはQWebPage::chooseFile () である可能性があります(Webサイトがそれをどのように処理しているかにも依存すると思います)。それを再実装して、それで十分かどうかを確認してください。好きなことをして、選択したファイル パスを返します。

編集:私がテストしたリンクを提供したので、うまくいくようです。

于 2012-12-03T23:02:12.510 に答える
1

これは、デフォルトの実装を多かれ少なかれ再現する純粋なPyQt4デモです。

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_())
于 2012-12-05T02:57:32.210 に答える
1

わかりました。まず、背景情報と参考文献から始めましょう。

使用するモジュールは、ここpywin32からダウンロードできます。具体的には、API リファレンスはこちらです。win32gui

ダイアログを操作する前に、ウィンドウ ハンドルに「ナビゲート」する必要があります。次の例ではAPIwin32.FindWindowリファレンスhere使用しています。この場合は、 lpclassName#32770lpWindowNameFile Upload

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

ファイルハンドルを見つけるコード:

import win32gui

control = win32gui.FindWindow("#32770", "File Upload")

そして、ハンドルを格納します。私の場合は721470.

次のステップは、ダイアログ内の GUI オブジェクトのハンドルを見つけることCancelです。ボタンの例を示します。ハンドルを見つけるには、FindWindowExここで API リファレンスを使用します。

import win32con
import win32api

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

についてはこちらを、 についてはこちらを参照てください。BM_CLICKSendMessage

最終的なコード:

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)

しかし、最も簡単な方法はautoit hereを使用することだと思います。以前にpyqtで使用して、コマンドを実行しました。

お役に立てれば!

追加の参考資料 (pywin32 バージョン):

win32gui ここ

win32api ここ

于 2012-12-04T01:10:09.160 に答える