2010-04-16 13 views
7

Así que digamos que estoy tratando de hacer clic en un enlace en el QWebView, esto es lo que tengo:Qt: Fuerza QWebView para hacer clic en un elemento web, aunque no visible en la ventana

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

Y se llame como tal:

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

el único problema es: si el elemento no es visible en la ventana, es imposible para hacer clic. Lo que quiero decir es que si tiene que desplazarse hacia abajo para verlo, no puede hacer clic en él. Me imagino que esto tiene que ver con la geometría, ya que el elemento no aparece en la pantalla, no puede hacer los cálculos para hacer clic derecho.

¿Alguna idea para evitar esto? ¿Tal vez alguna forma de hacer que la ventana se comporte como mil millones x mil millones de píxeles, pero aún así parece 200x200?

Respuesta

7

Creo que llamar a el.evaluateJavaScript("click()"); debería funcionar. Digo debería porque en el pasado he estado usando QWebElement::function() con el argumento "clic" con éxito. Sin embargo, este método no se convirtió en parte de QWebElement API. Creo que los autores llegaron a la conclusión de que era superfluo en presencia de QWebElement::evaluateJavaScript().

Mi pregunta similar - How to follow a link in QWebKit? - aún sin respuesta :(
me ocurrió la misma solución como si aquí - Problem with evaluateJavaScript()

1

Para aquellos que quieren hacer clic en el botón Webview luego hacer estos

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

OK, ¿puede ser una explicación? – quantum

7

Hola, sé que esta pregunta es bastante antigua, pero quería ofrecer una respuesta diferente. Usted dijo: "... ya que el elemento no aparece en la pantalla no puede hacer los cálculos para hacer clic en él. .. ". Bueno," es "no se puede hacer la matemática, pero" Usted "puede. ;) Puede obtener la posición del elemento sobre el que desea hacer clic y calcular cuántos píxeles (X) necesita para desplazarse hacia abajo/arriba para hacerlo visible. A continuación, puede desplazar automáticamente la página por X píxeles y usar el valor X para calcular la posición actual del elemento y hacer clic allí. La misma lógica se usa si tiene que desplazarse hacia la izquierda o hacia la derecha también. Solo use Y píxeles como un valor de corrección horizontal. He hecho esto en otro idioma y sé que es factible y funciona bien. :)

EDIT: (febrero 21 2013)

OK, he tenido que hacer esto para uno de mis proyectos también. Entonces, para ilustrar lo que quise decir más arriba, debajo está el código Qt. Me doy cuenta de que tiene algunos defectos, especialmente si se trata de elementos pequeños alrededor de los bordes de la página, pero en la mayoría de los casos funciona bien.

(en el código de abajo * elemt es el elemento que desea hacer clic en y * Web es el 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); 

Esto es lo que funciona para mí, cuando el java clic falla . Espero que sea útil para alguien más también.

+1

¡Impresionante! Para los que ejecutan su QWebPage en el fondo (y por lo tanto no tienen QWebView), usando 'webPage.currentFrame() -> documentElement(). Geometry()' para obtener 'web-> width()' y 'web-> height()' ¡funcionará también! – hakermania

Cuestiones relacionadas