Qt:强制QWebView点击一个web元素,即使是在窗口中看不到的元素

时间:2010-04-16 18:52:14

标签: c++ qt qtwebkit 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?

3 个答案:

答案 0 :(得分:7)

我认为调用el.evaluateJavaScript("click()");应该有效。我说应该工作,因为过去我一直在使用QWebElement::function()和“click”参数成功。但是,此方法未成为QWebElement API的一部分。我认为作者得出的结论是,QWebElement::evaluateJavaScript()出现时多余是多余的。

我的类似问题 - How to follow a link in QWebKit? - 仍然没有回答:(
我在这里提出了与你相同的解决方法 - Problem with evaluateJavaScript()

答案 1 :(得分:7)

嗨,我知道这个问题很老了,但我想提供一个不同的答案。 你说:“......因为元素没有显示在屏幕上,所以无法点击它...”。好吧,“”不能算数学,但“”可以。 ;) 您可以获取要单击的元素的位置,并计算向下/向上滚动所需的像素数( X )以使其可见。然后,您可以按 X 像素自动滚动页面,并使用 X 值计算元素的当前位置,然后单击此处。如果您还必须向左或向右滚动,则使用相同的逻辑。只需使用 Y 像素作为水平校正值。 我用另一种语言做了这个,我知道它是可行的并且工作正常。 :)

编辑:(2013年2月21日)

好的,我也必须为我的一个项目做这件事。为了说明我的意思,下面是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点击失败时,这对我有用。我希望它对其他人也有用。

答案 2 :(得分:1)

对于那些想要点击Webview按钮然后执行这些操作的人

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