Qt: Force QWebView, чтобы нажать на веб-элемент, даже один не виден в окне
Вопрос
Итак, скажем, я пытаюсь нажать на ссылку в 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();" );