2

以下のコードは、1 つのことを除いて正常に動作します。それは、サインアップ リンクをたどらないことです。ただし、実際のブラウザーに移動してコンソールに次のように入力すると:

document.getElementById("link-signup").click() 

目的のページにリダイレクトされます。設定で一部の機能を有効にしなかったために問題が発生したと考えていました。確信はないけど。

助けてくれてありがとう

#! /usr/bin/env python2.7

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

class GrabberSettings(QWebPage):
    def __init__(self):
        QWebPage.__init__(self)
        self.settings().setAttribute(QWebSettings.AutoLoadImages, False)

class Grabber(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        self.setPage(GrabberSettings())
        self.loadFinished.connect(self._loadComplete)
        self.doc = self.page().mainFrame().documentElement()

    def _loadComplete(self):
        print "Done"
        link = self.doc.findFirst('a[link-signup]')
        if link:
            print "link found"
        link.evaluateJavaScript('click()')

if __name__ == "__main__":
    app = QApplication(sys.argv)
    view = Grabber()
    gmail = QUrl('https://accounts.google.com')
    view.load(gmail)
    view.show()
    app.exec_()
4

1 に答える 1

4

失敗は、Google ページがロード後にclick()元の要素を変換するために JavaScript を使用する方法に関係があると思われます。で呼び出しAをラップすると、メソッドがevaluateJavaScript()alert()clicknull

link.evaluateJavaScript('this.click')

リンクの「クリック」を呼び出すことができるのは、100% のクロスブラウザー サポートではありません。ボタンである必要があります。

いくつかの選択肢があります...

(#1) リンクの href に移動するだけです

def _loadComplete(self):
    page = self.page()
    doc = page.currentFrame().documentElement()
    link = doc.findFirst('#link-signup')
    if link and not link.isNull():
        self.load(QUrl.fromEncoded(link.attribute('href').toAscii()))

(#2) Web ビューでのクリックをシミュレートする

def _loadComplete(self):
    page = self.page()
    doc = page.currentFrame().documentElement()
    link = doc.findFirst('#link-signup')
    if link and not link.isNull():
        pos = link.geometry().center()
        self._doMouseClick(page, pos)
    else:
        print "Link not found"

@staticmethod
def _doMouseClick(obj, pos):
    # mouse down
    evt = QMouseEvent(QEvent.MouseButtonPress, pos, 
                            Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
    QApplication.sendEvent(obj, evt)
    # mouse up
    evt = QMouseEvent(QEvent.MouseButtonRelease, pos, 
                            Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
    QApplication.sendEvent(obj, evt)

(#3) JavaScript でリンクをクリックできるようにする

def _loadComplete(self):
    page = self.page()
    doc = page.currentFrame().documentElement()
    link = doc.findFirst('#link-signup')
    if link and not link.isNull():
        link.evaluateJavaScript("""
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            this.dispatchEvent(e);  
        """)  
于 2012-11-25T19:26:58.733 に答える