简而言之:我想自动将图片上传到网站。但是,我无法模拟输入类型=文件。
我在网页中有以下输入元素。
<input id="fileupload" type="file" name="files[]" data-url="/server/images/e1b2d17b7b7eccef21a0a0ba1756d35c/upload/" multiple="">
我知道由于安全原因它被禁用来使用JS或JQuery来模拟这个元素。没关系。但是,我将页面加载到我的QWebElement中,我想通过模拟必要的鼠标点击自动上传图像。我已设法点击上传按钮但我无法模拟在打开的对话框中输入任何文件夹名称或文件名。我想我需要关注对话框,但无法做到。有人能引导我一点吗?
答案 0 :(得分:2)
您应该将鼠标单击事件发送到输入点坐标。这是PyQt代码。
# We need to scroll our window, to make input "visible" and get it's coordinates
el_pos = el.geometry().center() # el - QWebElement points to input
self._page.mainFrame().setScrollPosition(el_pos) # self._page - QWebPage
scr_pos = self._page.mainFrame().scrollPosition()
point_to_click = el_pos - scr_pos
# Create click on coordinates
press = QMouseEvent(QMouseEvent.MouseButtonPress, point_to_click, Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
release = QMouseEvent(QMouseEvent.MouseButtonRelease, point_to_click, Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
QApplication.postEvent(self._handler, press) # self._handler - QWebView
QApplication.postEvent(self._handler, release)
选择文件对话框&#34;打开&#34;后,Qt调用QWebPage.chooseFile()函数获取文件名,应该选择。我们需要在QWebPage:
中重新实现这个方法class WebPage(QWebPage):
def __init__(self):
QWebPage.__init__(self)
self.file_name = 'test.png' # file name we want to be choosed
def chooseFile(self, frame, suggested_file):
return self.file_name # file will be choosen after click on input type=file
更新:
还有一件事。如果输入允许选择多个文件,重新实现QWebPage.chooseFile()将无法正常工作。要解决此问题,您应该添加对QWebPage::ChooseMultipleFilesExtension的支持。这是simple example如何做到的。