7

因此,假设我正在尝试单击 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

唯一的问题是:如果元素在窗口中不可见,则无法单击。 我的意思是如果你必须向下滚动才能看到它,你不能点击它。我想这与几何形状有关,因为该元素没有显示在屏幕上,它无法进行数学运算以正确单击它。

有什么想法可以解决这个问题吗?也许某种方式可以使窗口表现得像十亿 x 十亿像素,但看起来仍然是 200x200?

4

3 回答 3

7

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

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

于 2010-04-17T01:15:12.127 回答
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点击失败时,这对我有用。我希望它对其他人也有用。

于 2013-02-04T09:05:27.140 回答
1

For those who want to click on Webview button then do these

frame1->evaluateJavaScript( "document.forms[0].submit();" ); 
于 2012-06-26T15:47:42.100 回答