所以,假设我正在尝试点击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?
答案 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();" );