2010-04-16 7 views
7

所以我們可以說我試圖點擊QWebView的鏈接,這裏是我有:的Qt:強制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?

回答

7

我認爲要求el.evaluateJavaScript("click()");應該工作。我說應該工作,因爲在過去,我一直在使用QWebElement::function()與「點擊」參數成功。但是,此方法並未成爲QWebElement API的一部分。我認爲作者得出結論,在QWebElement::evaluateJavaScript()的存在下這是多餘的。

我類似的問題 - How to follow a link in QWebKit? - 仍然沒有答案:(
我來到了這裏相同的解決方法像你一樣 - Problem with evaluateJavaScript()

1

對於那些誰想要點擊網頁視圖按鈕,然後做這些

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

好的答案,可能是一些解釋? – quantum 2012-10-20 01:36:16

7

嗨,我知道這個問題是相當老,但我想提供一個不同的答案。 你說:「...因爲元素不顯示在屏幕上它不能做數學點擊它。 ..「好吧,」「不能做數學,但」「可以。 ;) 您可以獲取要點擊的元素的位置,然後計算需要向下/向下滾動以顯示多少像素(X)。然後,您可以通過X像素自動滾動頁面,並使用X值來計算元素的當前位置並單擊該位置。如果您必須向左或向右滾動,則使用相同的邏輯。只需使用Y像素作爲水平校正值。 我已經用另一種語言完成了這項工作,我知道這是可行的,並且工作正常。 :)

編輯:(2013年2月21日)

OK,我不得不爲我的項目之一就此別過。爲了說明我的意思,下面是Qt代碼。我意識到它有一些缺陷,特別是如果你正在處理頁面邊緣的小元素,但在大多數情況下,它工作得很好。

(以下* elemt代碼是你想要點擊的元素和*網絡是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點擊失敗。我希望它對其他人也有用。

+1

太棒了!對於那些在後臺運行QWebPage(因此它們沒有QWebView),使用'webPage.currentFrame() - > documentElement()。幾何()'獲取'web-> width()'和'web-> height()'也會起作用! – hakermania 2014-04-23 18:58:56

相關問題