所以,假设我试图点击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()
"点击"论证成功.但是,此方法未成为QWebElement API的一部分.我认为作者得出结论,在存在的情况下它是多余的QWebElement::evaluateJavaScript()
.
我的类似问题 - 如何关注QWebKit中的链接?- 仍然没有答案:(
我想出了像你这样的解决方法 - evaluateJavaScript()的问题
嗨,我知道这个问题很老,但我想提供一个不同的答案.你说:"......因为元素没有显示在屏幕上,所以无法点击它...".好吧," 它 "不能做数学,但" 你 "可以.;)您可以获取要单击的元素的位置,并计算向下/向上滚动所需的像素数(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点击失败时,这对我有用.我希望它对其他人也有用.