2010-04-16 5 views
7

Also lassen Sie uns sagen, ich versuche, einen Link in der QWebView zu klicken, hier ist das, was ich habe:Qt: Kraft QWebView auf einem Web-Element klicken, auch ein nicht sichtbar auf dem Fenster

// 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 Sie nennen es wie so:

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

das Problem ist nur: , wenn das Element nicht im Fenster 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 stelle mir vor, dass dies mit der Geometrie zu tun hat, da das Element nicht auf dem Bildschirm angezeigt wird, kann es nicht richtig berechnet werden.

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

Antwort

7

Ich denke, Anruf el.evaluateJavaScript("click()"); sollte funktionieren. Ich sage sollte arbeiten, weil ich in der Vergangenheit QWebElement::function() mit "Klick" Argument mit Erfolg verwendet habe. Diese Methode wurde jedoch nicht Teil der QWebElement-API. Ich denke, Autoren sind zum Schluss gekommen, dass es in Gegenwart von QWebElement::evaluateJavaScript() überflüssig war.

Meine ähnliche Frage - How to follow a link in QWebKit? - noch ohne Antwort :(
kam ich hier mit dem gleichen Problem zu umgehen, wie Sie up - Problem with evaluateJavaScript()

1

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

frame1->evaluateJavaScript("document.forms[0].submit();"); 
+0

OK Antwort, kann eine Erklärung sein? – quantum

7

Hi ich weiß, dass diese Frage ziemlich alt ist, aber ich wollte eine andere Antwort anbieten: Sie sagten: "... da das Element nicht auf dem Bildschirm angezeigt wird, kann es nicht mathematisch darauf klicken. .. ". Nun," es "kann nicht die Mathematik, aber" Sie "kann. ;) Sie können die Position des Elements, auf das Sie klicken möchten, ermitteln und berechnen, wie viele Pixel (X) Sie nach unten/oben scrollen müssen, um es sichtbar zu machen. Dann können Sie die Seite automatisch durch X Pixel scrollen und den Wert X verwenden, um die aktuelle Position des Elements zu berechnen und dort zu klicken. Die gleiche Logik wird verwendet, wenn Sie auch nach links oder rechts blättern müssen. Verwenden Sie einfach Y Pixel als horizontalen Korrekturwert. Ich habe das in einer anderen Sprache gemacht und ich weiß, dass es machbar ist und gut funktioniert. :)

EDIT: (21 Feb 2013)

OK, ich hatte das auch meine Projekte für einen tun. Um zu veranschaulichen, was ich oben meinte, ist unten der Qt-Code. Ich erkenne, dass es einige Fehler hat, besonders wenn Sie mit kleinen Elementen an den Seitenrändern arbeiten, aber in den meisten Fällen funktioniert es gut.

(im folgenden Code * elemt ist das Element, das Sie klicken Sie wollen und * web 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 ist, was für mich funktioniert, wenn die Java-Klick ausfällt . Ich hoffe, dass es auch für jemand anderen nützlich sein wird.

+1

Super! Für diejenigen, die ihre QWebPage im Hintergrund ausführen (und daher kein QWebView haben), verwenden Sie 'webPage.currentFrame() -> documentElement(). Geometry()', um die 'web-> width()' und 'web-> height()' wird auch funktionieren! – hakermania