Python PyQt-表单未提交

Python PyQt-表单未提交,python,pyqt,pyqt4,spynner,Python,Pyqt,Pyqt4,Spynner,我正在尝试使用PyQt提交表单。我最初是通过Spyner使用它的,但在我的repl中,我将其解构为原始PyQT调用,试图调试这个问题 >>> obr.webframe.findAllElements('.qust input').toList() [<PyQt4.QtWebKit.QWebElement object at 0xa343f7c>, <PyQt4.QtWebKit.QWebElement object at 0xa343fb4>] >

我正在尝试使用PyQt提交表单。我最初是通过Spyner使用它的,但在我的repl中,我将其解构为原始PyQT调用,试图调试这个问题

>>> obr.webframe.findAllElements('.qust input').toList()
[<PyQt4.QtWebKit.QWebElement object at 0xa343f7c>, <PyQt4.QtWebKit.QWebElement object at 0xa343fb4>]
>>> 
>>> elem = obr.webframe.findAllElements('.qust input').toList()[1]
>>> elem.setFocus()
>>> elem.evaluateJavaScript("this.click()") 
最后:

>>> obr.webframe.findFirstElement('form')
<PyQt4.QtWebKit.QWebElement object at 0xa34387c>
>>> obr.webframe.findFirstElement('form').evaluateJavaScript('this.submit();')
<PyQt4.QtCore.QVariant object at 0xa343f44>
>>> 

如果有人有任何想法或建议,我将不胜感激。正如你所看到的,我一直在抓救命稻草。不是我喜欢的调试风格…

您应该使用单击解决方案,因为这将确保在单击提交按钮时,如果页面执行了一些javascript代码,也会调用它。它可以更改甚至向post数据添加其他字段。 通常,您使用的代码是正确的,请尝试使用以下代码段启动javascript单击事件:

elem = obr.webframe.findAllElements('.qust input').toList()[1]
js_click = """
           var evt = document.createEvent("MouseEvents");
           evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, this);
           this.dispatchEvent(evt);
           """
elem.evaluateJavaScript(js_click)

谢谢andrean,我今天要试一试。还是不行。我觉得很奇怪。该页面确实有一个简单的onsubmit事件监听器,它会被触发。我确信它返回的是“真的”,我也尝试直接删除它。同样奇怪的是,页面上有调用3秒setTimeout()的代码,而传递给它的函数从未触发。没有更好地了解PyQt,我无法理解这两个东西是否相互关联。如果是公共页面,您能显示该页面的链接吗?此外,如果从onclick或onsubmit事件处理程序调用setTimeout,则正常事件冒泡可能在事件处理程序内停止,setTimeout调用延迟请求,该回调可能会更改内容或执行另一个请求。还有一种可能性是,当点击submit按钮时,js代码会进行一些数据验证,但数据没有通过验证,因此请求从未启动。Andrean,我无法共享URL。我正在进行逆向工程,为我们的用户提供一种从最近在我们的数据导入中遭到攻击的服务中导出数据的方法。这件事对我来说很奇怪。我正在使用evaluateJavascript()调用一个函数。该函数称为fine。在函数中,它执行设置超时(3000)。超时永远不会触发。但是我可以手动调用传递给setTimeout的函数,它工作正常。我觉得很奇怪。我假设python代码的其余部分是正确的,对吗?那么应用程序的事件循环正在运行,webview的loadFinished信号连接到一个函数,该函数将读取结果?你能跟随firebug的“网络”面板吗?当你点击提交按钮时会发生什么?是否立即发出请求,并在3秒后、3秒后或单击后立即发出另一个请求?如果单击后立即有一个请求,并且它在setTimeout启动另一个请求之前返回一个结果(如果有),则loadFinished将在不等待另一个请求启动的情况下发出。
>>> obr.webframe.findFirstElement('form').attribute('action')
PyQt4.QtCore.QString(u'SubmitPage.aspx?g=d7a717c38&ust=72a0fc7b&nm=01f00&se=53')
>>> obr.webframe.findFirstElement('form').attribute('method')
PyQt4.QtCore.QString(u'post')
elem = obr.webframe.findAllElements('.qust input').toList()[1]
js_click = """
           var evt = document.createEvent("MouseEvents");
           evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, this);
           this.dispatchEvent(evt);
           """
elem.evaluateJavaScript(js_click)