2010-04-16 22 views
7

Quindi diciamo che sto cercando di fare clic su un link nella QWebView, qui è quello che ho:Qt: Forza QWebView per fare clic su un elemento web, anche uno non visibile nella finestra

// 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); 
} 

E si chiama come così:

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

l'unico problema è: se l'elemento non è visibile nella finestra, è impossibile fare clic su. Quello che voglio dire è che se devi scorrere verso il basso per vederlo, non puoi cliccarlo. Immagino che questo abbia a che fare con la geometria, dal momento che l'elemento non viene visualizzato sullo schermo e non può fare il calcolo matematico per fare clic su di esso.

Qualche idea per aggirare questo? Forse un modo per far sì che la finestra si comporti come un miliardo di miliardi di pixel ma sembra ancora 200x200?

risposta

7

Penso che chiamare el.evaluateJavaScript("click()"); dovrebbe funzionare. Dico dovrebbe funzionare perché in passato ho utilizzato QWebElement::function() con l'argomento "clic" con successo. Tuttavia, questo metodo non è diventato parte dell'API di QWebElement. Penso che gli autori siano giunti alla conclusione che era superfluo in presenza di QWebElement::evaluateJavaScript().

La mia domanda simile - How to follow a link in QWebKit? - ancora senza risposta :(
mi si avvicinò con la stessa soluzione come te qui - Problem with evaluateJavaScript()

1

Per chi vuole fare clic sul pulsante Webview poi fare queste

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

OK risposta, potrebbe essere una spiegazione? – quantum

7

Ciao, so che questa domanda è piuttosto vecchia, ma volevo offrire una risposta diversa. Hai detto: "... poiché l'elemento non viene visualizzato sullo schermo, non può fare il calcolo della matematica per selezionarlo. .. ". Bene", it "impossibile eseguire i calcoli, ma" "can. ;) È possibile ottenere la posizione dell'elemento su cui si desidera fare clic e calcolare quanti pixel (X) è necessario scorrere verso il basso/verso l'alto per renderlo visibile. Quindi puoi scorrere automaticamente la pagina di X pixel e utilizzare il valore X per calcolare la posizione corrente dell'elemento e fare clic qui. La stessa logica viene utilizzata se si deve scorrere verso sinistra o verso destra. Basta usare Y pixel come valore di correzione orizzontale. Ho fatto questo in un'altra lingua e so che è fattibile e funziona bene. :)

EDIT: (Feb 21 2013)

OK, ho dovuto fare questo per uno dei miei progetti troppo. Quindi per illustrare cosa intendevo sopra, sotto c'è il codice Qt. Mi rendo conto che ha alcuni difetti, specialmente se si hanno a che fare con piccoli elementi attorno ai bordi della pagina, ma nella maggior parte dei casi funziona bene.

(nel seguente codice * elemt è l'elemento che si desidera fare clic su e * web è il widget QWebView)

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

Questo è ciò che funziona per me, quando il java click fallisce . Spero che possa essere utile anche a qualcun altro.

+1

Fantastico! Per quelli che eseguono la loro QWebPage sullo sfondo (e quindi non hanno una QWebView), usando 'webPage.currentFrame() -> documentElement(). Geometry()' per ottenere 'web-> width()' e 'web-> height()' funzionerà pure! – hakermania