4

QtWebKitモジュールを使用してvk.comに写真をアップロードしようとしています。私が直面している問題は、の値を適切に満たすことができないことです。これが私が使用するいくつかの関連コードです:input(type="file")

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()

どんな助けでもとても素晴らしいでしょう。
ありがとう。

4

1 に答える 1

6

セキュリティ上の理由から、このsetAttribute方法はまだ機能しない可能性があります。

ただし、通常はアップロード ダイアログを開いてファイル名を返す関数QWebPage::chooseFileを再定義して、ダイアログを開かずに静的ファイル名を返すようにし、input 要素で「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_())
于 2013-03-16T01:29:20.027 に答える