2

我想使用 PyQt4 的 QWebView 自动将文件上传到网站,但有一部分我还不知道。要上传文件,该网站有一个按钮,它会打开一个对话框,您应该从中选择本地文件。所以,这些是我的问题:) 有没有办法在我点击按钮后控制该对话框?有没有更好的方法来实现这一目标?

编辑

该网站是https://maps.google.com/我正在通过My Places > Create Map > Import上传一个 .kml 文件。

4

3 回答 3

4

您正在寻找的可能是QWebPage::chooseFile () (我想这也取决于网站如何处理它)。重新实现它,看看它是否足够。做任何你想做的事情并返回选择的文件路径。

编辑:现在您提供了我测试过的链接并且似乎有效。

于 2012-12-03T23:02:12.510 回答
1

好的,首先让我从背景信息和参考资料开始。

我将使用的模块在这里pywin32下载,具体来说,API 参考在这里win32gui

现在,在您可以操作对话框之前,您必须“导航”到窗口句柄,以下使用win32.FindWindowAPI Reference here,看起来像这样,其中两个输入是lpclassName在这种情况下#32770(代表对话框)引用herelpWindowNamewhich在这种情况下File 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)

参考here for theBM_CLICKhere for the SendMessage

最终代码:

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模块,这里,示例如下:

from watsup.winGuiAuto import *

optDialog = findTopWindow(wantedText="File Upload")

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

clickButton(SaveButton)

但我相信最简单的方法是在autoit 这里使用,我之前在 pyqt 中使用过它,用于射出命令。

希望这可以帮助!

其他参考资料(pywin32 版本):

win32gui 这里

win32api 这里

于 2012-12-04T01:10:09.160 回答
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 回答