Qt: заставить QWebView нажимать на веб-элемент, даже если он не виден в окне - PullRequest
7 голосов
/ 16 апреля 2010

Допустим, я пытаюсь щелкнуть ссылку в QWebView, вот что у меня есть:

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

И вы называете это так:

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

ЕДИНСТВЕННАЯ ПРОБЛЕМА: если элемент не виден в окне, щелкнуть по нему невозможно. Я имею в виду, что если вам нужно прокрутить вниз, чтобы увидеть его, вы не можете нажать на него , Я полагаю, что это связано с геометрией, так как элемент не отображается на экране, он не может сделать математику, чтобы щелкнуть правой кнопкой мыши.

Есть идеи, чтобы обойти это? Может быть, какой-нибудь способ заставить окно вести себя как миллиард х миллиардов пикселей, но при этом выглядеть 200х200?

Ответы [ 3 ]

7 голосов
/ 04 февраля 2013

Привет, я знаю, что этот вопрос довольно старый, но я хотел предложить другой ответ. Вы сказали: «... так как элемент не отображается на экране, он не может выполнить математические операции, чтобы щелкнуть по нему ...». Ну, " it " не может сделать математику, но " You " может. ;) Вы можете получить позицию элемента, по которому вы хотите щелкнуть, и рассчитать, сколько пикселей ( X ) вам нужно прокрутить вниз / вверх, чтобы сделать его видимым. Затем вы можете автоматически прокрутить страницу на X пикселей и использовать значение X , чтобы вычислить текущую позицию элемента и щелкнуть там. Та же логика используется, если вам нужно прокрутить влево или вправо тоже. Просто используйте Y пикселей в качестве значения горизонтальной коррекции. Я сделал это на другом языке, и я знаю, что это выполнимо и отлично работает. :)

РЕДАКТИРОВАТЬ: (21 февраля 2013 г.)

ОК, я должен был сделать это и для одного из моих проектов. Чтобы проиллюстрировать, что я имел в виду выше, ниже приведен код Qt. Я понимаю, что у него есть некоторые недостатки, особенно если вы имеете дело с небольшими элементами по краям страницы, но в большинстве случаев это работает просто отлично.

(в приведенном ниже коде * elemt - элемент, на который вы хотите щелкнуть, а * web - виджет 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);

Это то, что у меня работает, когда щелчок Java не срабатывает. Надеюсь, это будет полезно и кому-то еще.

7 голосов
/ 17 апреля 2010

Я думаю, что звонок el.evaluateJavaScript("click()"); должен работать. Я говорю, что должно работать, потому что в прошлом я использовал QWebElement::function() с аргументом "click" с успехом. Однако этот метод не стал частью API QWebElement. Я думаю, что авторы пришли к выводу, что это было излишним в присутствии QWebElement::evaluateJavaScript().

Мой похожий вопрос - Как перейти по ссылке в QWebKit? - все еще без ответа: (
Я нашел такой же обходной путь, как и вы, здесь - Проблема сvaluJavaScript ()

1 голос
/ 26 июня 2012

Для тех, кто хочет нажать на кнопку Webview, сделайте это

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