我想使用 PyQt4 的 QWebView 自动将文件上传到网站,但有一部分我还不知道。要上传文件,该网站有一个按钮,它会打开一个对话框,您应该从中选择本地文件。所以,这些是我的问题:) 有没有办法在我点击按钮后控制该对话框?有没有更好的方法来实现这一目标?
编辑
该网站是https://maps.google.com/我正在通过My Places > Create Map > Import上传一个 .kml 文件。
我想使用 PyQt4 的 QWebView 自动将文件上传到网站,但有一部分我还不知道。要上传文件,该网站有一个按钮,它会打开一个对话框,您应该从中选择本地文件。所以,这些是我的问题:) 有没有办法在我点击按钮后控制该对话框?有没有更好的方法来实现这一目标?
编辑
该网站是https://maps.google.com/我正在通过My Places > Create Map > Import上传一个 .kml 文件。
您正在寻找的可能是QWebPage::chooseFile () (我想这也取决于网站如何处理它)。重新实现它,看看它是否足够。做任何你想做的事情并返回选择的文件路径。
编辑:现在您提供了我测试过的链接并且似乎有效。
好的,首先让我从背景信息和参考资料开始。
我将使用的模块在这里pywin32
下载,具体来说,API 参考在这里。win32gui
现在,在您可以操作对话框之前,您必须“导航”到窗口句柄,以下使用win32.FindWindow
API Reference here,看起来像这样,其中两个输入是lpclassName
在这种情况下#32770
(代表对话框)引用here和lpWindowName
which在这种情况下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_CLICK
和here 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
这里
这是一个纯粹的 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_())