我想使用PyQt4的QWebView自动将文件上传到网站,但还有一部分我还想不通。要上传文件,网站上有一个按钮,打开一个对话框,您可以从中选择本地文件。所以,这些是我的问题:)有没有办法在我点击按钮后控制该对话框?有没有更好的方法来实现这一目标?
修改的
该网站为https://maps.google.com/,我通过我的地点>上传.kml文件创建地图>导入的
答案 0 :(得分:4)
您正在寻找的是QWebPage::chooseFile()(我想这也取决于网站如何处理)。重新实现并查看是否足够。做任何你想做的事情并返回选择的文件路径。
编辑:现在您提供了我测试过的链接,似乎可以正常工作。答案 1 :(得分:1)
好的,开始让我先从背景信息和参考文献开始。
我将使用的模块是pywin32
下载here,特别是win32gui
,API参考here。
现在,在您可以操作对话框之前,您必须“导航”到窗口句柄,以下使用win32.FindWindow
API参考here,它看起来像这样,其中两个输入是{{ 1}}在这种情况下lpclassName
(代表对话)参考here和#32770
,在这种情况下是lpWindowName
,
File Upload
查找文件句柄的代码:
HWND WINAPI FindWindow(
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName
);
它存储句柄,在我的例子中是import win32gui
control = win32gui.FindWindow("#32770", "File Upload")
。
下一步是在对话框中找到GUI对象的句柄,我将显示721470
按钮的示例。要查找句柄,我将在此处使用Cancel
API参考,
FindWindowEx
import win32con
import win32api
ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel");
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0)
的参考here和BM_CLICK
的{{3}}。
最终代码:
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)
模块,here,例如:
watsup.winGuiAuto
但我相信最简单的方法是使用from watsup.winGuiAuto import *
optDialog = findTopWindow(wantedText="File Upload")
CancelButton = findControl(optDialog,wantedClass="Button", wantedText="Cancel")
clickButton(SaveButton)
here,我之前在pyqt中使用它来拍摄命令。
希望这有帮助!
其他参考文献(pywin32版本):
autoit
here
win32gui
here
答案 2 :(得分:1)
我认为@LucaCarlon给出的解决方案是正确的,值得奖励。
这是经过测试的纯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_())