Qt 如何使用QWebElement设置输入值(type=";file";)?

Qt 如何使用QWebElement设置输入值(type=";file";)?,qt,qt4,qtwebkit,qwebelement,Qt,Qt4,Qtwebkit,Qwebelement,我正在尝试使用模块将照片上载到。我面临的问题是无法正确填充输入(type=“file”)的值。以下是我使用的一些相关代码: def upload(): 打印“上传…” photoInput=web.page().mainFrame().documentElement().findFirst('input[id=“照片上传\输入”]”) 断言photoInput,“未找到输入” photoInput.setAttribute('value','/Users/elmigranto/Downloads

我正在尝试使用模块将照片上载到。我面临的问题是无法正确填充
输入(type=“file”)
的值。以下是我使用的一些相关代码:

def upload():
打印“上传…”
photoInput=web.page().mainFrame().documentElement().findFirst('input[id=“照片上传\输入”]”)
断言photoInput,“未找到输入”
photoInput.setAttribute('value','/Users/elmigranto/Downloads/stuff.png'))
打印photoInput.evaluateJavaScript('returnthis.value;')).toString()
值得注意的是,由于浏览器安全策略的原因,Javascript无法填充文件输入值。但是,应该可以使用qtapi,更具体地说,是使用
方法。这就是我所做的…没有任何效果(嗯,
photoInput.attribute('value')
返回预期的结果,但是
photoInput.evaluateJavaScript('returnthis.value;'))。toString()
返回空字符串,输入的
onchange
处理程序也不会被触发)

设置其他属性没有问题,例如,
就像一个符咒


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

出于安全原因,
setAttribute
方法可能仍然不起作用

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

这似乎有效:

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_())
从PyQt4.QtCore导入*
从PyQt4.QtGui导入*
从PyQt4.QtWebKit导入*
导入系统
班级网页(QWebPage):
def uuu init uuu(self,parent=None):
超级(网页,自我)。\uuuuu初始化\uuuuuuuuu(父)
self.overrideUpload=无
def chooseFile(自身、原始帧、旧文件):
如果self.overrideUpload为无:
返回超级(网页,自我)。选择文件(原始框架,旧文件)
结果=self.overrideUpload
self.overrideUpload=无
返回结果
def setUploadFile(自身、选择器、文件名):
button=self.mainFrame().documentElement().findFirst(选择器)
self.overrideUpload=文件名
#在输入元素上设置焦点
setFocus();
#并模拟一个按键事件,使其调用我们的chooseFile方法
事件(QKeyEvent(QEvent.KeyPress,Qt.Key\u Enter,Qt.NoModifier))
def upload():
打印“上传…”
page.setUploadFile('input[id=“photos\u upload\u input”]”,
“/Users/elmigranto/Downloads/stuff.png”)
#这种变化似乎是异步的,至少是不可见的
#就在上次电话之后
app=QApplication(sys.argv)
webview=QWebView()
页面=网页(webview)
webview.setPage(第页)
来源=“”
选择一个文件:
'''
webview.loadFinished.connect(上传)
webview.show()
webview.setHtml(源代码)
sys.exit(app.exec_())

< WebVIEW事件(QKEYEVER(QEVET.KEYPASE,QT.KEYNECTRANT,QT.NONDIONDER))如何被翻译成它的C++等价物?@ USE939:这应该工作:<代码> QKEYEGEL键事件(qEng::KEYPASE,QT::KEYGENORT,QT::NoNODIVER);webview->event(&keyEvent)
。我可以使用
WebKit.NET
CefSharp
执行此操作吗?我搜索了很多,但找不到与
QWebPage
setPage()
method@Jack你真的需要模拟用户输入吗?您不能使用HttpWebRequest手动创建POST查询吗?(like)@alexisdm:忽略前面的注释,如何设置当前页面中打开的输入类型=文件?