QT: Erzwingen Sie QWebView, um auf ein Webelement zu klicken, selbst eines, das nicht im Fenster sichtbar ist

StackOverflow https://stackoverflow.com/questions/2655414

  •  27-09-2019
  •  | 
  •  

Frage

Nehmen wir also an, ich versuche, auf einen Link in der QWebview zu klicken. Hier ist, was ich habe:

// extending QWebView
void MyWebView::click(const QString &selectorQuery)
{
    QWebElement el = this->page()->mainFrame()->findFirstElement(selectorQuery);
    if (!el)
         return;

    el.setFocus();

    QMouseEvent pressEvent(QMouseEvent::MouseButtonPress, el.geometry().center(), 
                    Qt::MouseButton::LeftButton, Qt::LeftButton, Qt::NoModifier);
    QCoreApplication::sendEvent(this, &pressEvent);

    QMouseEvent releaseEvent(QMouseEvent::MouseButtonRelease, 
                             el.geometry().center(), Qt::MouseButton::LeftButton,
                             Qt::LeftButton, Qt::NoModifier);
    QCoreApplication::sendEvent(this, &releaseEvent);
}

Und du nennst es so:

myWebView->click("a[href]");  // will click first link on page
myWebView->click("input[type=submit]"); // submits a form

Das einzige Problem ist: Wenn das Element im Fenster nicht sichtbar ist, ist es unmöglich zu klicken. Was ich meine ist, wenn Sie nach unten scrollen müssen, um es zu sehen, können Sie nicht darauf klicken. Ich kann mir vorstellen, dass dies mit der Geometrie zu tun hat, da das Element nicht auf dem Bildschirm angezeigt wird, kann es nicht in der Mathematik erfolgen, um auf richtig zu klicken.

Irgendwelche Ideen, um das umzugehen? Vielleicht eine Möglichkeit, das Fenster wie eine Milliarden Milliarden Pixel zu verhalten, aber immer noch 200x200 aussehen?

War es hilfreich?

Lösung

Ich denke, ich rufe an el.evaluateJavaScript("click()"); sollte arbeiten. ich sage sollte Arbeiten, weil ich in der Vergangenheit benutzte QWebElement::function() mit "Klicken" -Argument mit Erfolg. Diese Methode wurde jedoch nicht Teil der Qwebelement -API. Ich denke QWebElement::evaluateJavaScript().

Meine ähnliche Frage - Wie folge ich einem Link in Qwebkit? - immer noch ohne Antwort :(
Ich habe die gleiche Problemumgehung wie Sie hier gefunden - Problem mit evaluatejavaScript ()

Andere Tipps

Hallo, ich weiß, dass diese Frage ziemlich alt ist, aber ich wollte eine andere Antwort geben. Sie sagten: "... da das Element nicht auf dem Bildschirm angezeigt wird, kann es nicht die Mathematik machen, um darauf zu klicken ...". Brunnen, "es"Kann nicht nachgedacht werden, aber"Du"Can ...;) Sie können die Position des Elements erhalten, auf das Sie klicken möchten, und berechnen, wie viele Pixel (X) Sie müssen nach unten/nach unten scrollen, um es sichtbar zu machen. Dann können Sie die Seite nach automatisch scrollen X Pixel und verwenden Sie die X Wert, um die aktuelle Position des Elements zu berechnen und dorthin zu klicken. Die gleiche Logik wird verwendet, wenn Sie auch links oder rechts scrollen müssen. Benutz einfach Y Pixel als horizontaler Korrekturwert. Ich habe das in einer anderen Sprache getan und ich weiß, dass es machbar ist und gut funktioniert. :)

Bearbeiten: (21. Februar 2013)

Ok, ich musste das auch für eines meiner Projekte tun. Um zu veranschaulichen, was ich oben meinte, finden Sie unten der QT -Code. Mir ist klar, dass es einige Mängel hat, insbesondere wenn Sie mit kleinen Elementen an den Seitenkanten zu tun haben, aber in den meisten Fällen funktioniert es gut.

(im folgenden Code *Elemt ist das Element, auf das Sie klicken möchten und *Netz ist das QWebView -Widget)

QRect elGeom=element->geometry();
QPoint elPoint=elGeom.center();
int elX=elPoint.x();
int elY=elPoint.y();
int webWidth=web->width();
int webHeight=web->height();
int pixelsToScrolRight=0;
int pixelsToScrolDown=0;
if (elX>webWidth) pixelsToScrolRight=elX-webWidth+elGeom.width()/2+10; //the +10 part if for the page to scroll a bit further
if (elY>webHeight) pixelsToScrolDown=elY-webHeight+elGeom.height()/2+10; //the +10 part if for the page to scroll a bit further
web->page()->mainFrame()->setScrollBarValue(Qt::Horizontal,pixelsToScrolRight);
web->page()->mainFrame()->setScrollBarValue(Qt::Vertical,pixelsToScrolDown);
QPoint pointToClick(elX-pixelsToScrolRight,elY-pixelsToScrolDown);

QMouseEvent pressEvent(QMouseEvent::MouseButtonPress,pointToClick,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
QCoreApplication::sendEvent(web, &pressEvent);
QMouseEvent releaseEvent(QMouseEvent::MouseButtonRelease,pointToClick,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
QCoreApplication::sendEvent(web, &releaseEvent);

Dies funktioniert für mich, wenn der Java -Klick fehlschlägt. Ich hoffe, es wird auch für jemand anderen nützlich sein.

Für diejenigen, die auf die Schaltfläche WebView klicken möchten, dann tun Sie diese

frame1->evaluateJavaScript( "document.forms[0].submit();" ); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top