当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Qt:强制QWebView点击一个web元素,即使是在窗口中看不到的元素》经验,为你挑选了2个好方法。

所以,假设我试图点击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?



1> Piotr Dobrog..:

我认为打电话el.evaluateJavaScript("click()");应该有效.我说应该工作,因为在过去我一直在使用QWebElement::function()"点击"论证成功.但是,此方法未成为QWebElement API的一部分.我认为作者得出结论,在存在的情况下它是多余的QWebElement::evaluateJavaScript().

我的类似问题 - 如何关注QWebKit中的链接?- 仍然没有答案:(
我想出了像你这样的解决方法 - evaluateJavaScript()的问题



2> dv8..:

嗨,我知道这个问题很老,但我想提供一个不同的答案.你说:"......因为元素没有显示在屏幕上,所以无法点击它...".好吧," "不能做数学,但" "可以.;)您可以获取要单击的元素的位置,并计算向下/向上滚动所需的像素数(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点击失败时,这对我有用.我希望它对其他人也有用.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有