gpt4 book ai didi

qt - 如何使用 QWebElement 设置输入值(类型 ="file")?

转载 作者:行者123 更新时间:2023-12-04 13:15:46 24 4
gpt4 key购买 nike

我正在尝试将照片上传到 vk.com使用 QtWebKit模块。我面临的问题是无法正确填写input(type="file")的值(value)。这是我使用的一些相关代码:

def upload():
print 'uploading...'
photoInput = web.page().mainFrame().documentElement().findFirst('input[id="photos_upload_input"]')
assert photoInput, 'No input found'
photoInput.setAttribute('value', '/Users/elmigranto/Downloads/stuff.png')

print photoInput.evaluateJavaScript('return this.value;').toString()

需要注意的是,由于浏览器安全策略的原因,Javascript 无法填充文件输入的值。但是,应该可以使用 Qt API,更具体地说, QWebElement :: setAttribute() 方法。这就是我所做的……没有任何效果(嗯, photoInput.attribute('value') 返回预期结果,但 photoInput.evaluateJavaScript('return this.value;').toString() 返回空字符串,输入的 onchange 处理程序也未触发)。

设置其他属性也没问题,比如 QWebElement :: addClass() 奇迹般有效。

任何帮助都会非常棒。谢谢。

最佳答案

setAttribute出于安全原因,该方法可能仍然无法正常工作。

但是你可以重新定义函数QWebPage::chooseFile这通常应该打开上传对话框并返回文件名,以便它在不打开对话框的情况下返回静态文件名,并通过模拟输入元素上的“返回”键来激活该上传。

这似乎有效:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import sys

class WebPage(QWebPage):
def __init__(self, parent = None):
super(WebPage, self).__init__(parent)
self.overrideUpload = None

def chooseFile(self, originatingFrame, oldFile):
if self.overrideUpload is None:
return super(WebPage, self).chooseFile(originatingFrame, oldFile)
result = self.overrideUpload
self.overrideUpload = None
return result

def setUploadFile(self, selector, filename):
button = self.mainFrame().documentElement().findFirst(selector)
self.overrideUpload = filename
# set the focus on the input element
button.setFocus();
# and simulate a keypress event to make it call our chooseFile method
webview.event(QKeyEvent(QEvent.KeyPress, Qt.Key_Enter, Qt.NoModifier))

def upload():
print 'uploading...'
page.setUploadFile('input[id="photos_upload_input"]',
'/Users/elmigranto/Downloads/stuff.png')
# The change seems to be asynchronous, at it isn't visible
# just after the previous call

app = QApplication(sys.argv)
webview = QWebView()
page = WebPage(webview)
webview.setPage(page)
source = '''
<form action="#">
Select a file: <input type="file" id="photos_upload_input">
<input type="submit">
</form>
'''
webview.loadFinished.connect(upload)
webview.show()
webview.setHtml(source)
sys.exit(app.exec_())

关于qt - 如何使用 QWebElement 设置输入值(类型 ="file")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15255300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com