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:忽略前面的注释,如何设置当前页面中打开的输入类型=文件?