Qt: Force QWebView, чтобы нажать на веб-элемент, даже один не виден в окне

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

  •  27-09-2019
  •  | 
  •  

Вопрос

Итак, скажем, я пытаюсь нажать на ссылку в 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

Единственная проблема в том, Если элемент не виден в окне, невозможно нажать. То, что я имею в виду, если вы должны прокрутить вниз, чтобы увидеть его, вы не можете нажать на него. Предлагаю, что это связано с геометрией, поскольку элемент не отображается на экране, он не может сделать математику, чтобы нажать на него правильно.

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

Это было полезно?

Решение

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

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

Другие советы

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

Редактировать: (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 Click не удается. Я надеюсь, что это будет полезно для кого-то другого.

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

frame1->evaluateJavaScript( "document.forms[0].submit();" ); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top