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

唯一の問題は、要素がウィンドウに表示されていない場合、クリックできないことです。 つまり、下にスクロールして表示する必要がある場合は、クリックできません。要素が画面に表示されないため、これはジオメトリに関係していると思います。要素を右クリックするための計算を行うことはできません。

これを回避するためのアイデアはありますか?たぶん、ウィンドウを10億x 10億ピクセルのように動作させながら、200x200に見えるようにする方法はありますか?

4

3 に答える 3

7

こんにちは私はこの質問がかなり古いことを知っています、しかし私は別の答えを提供したかったです。あなたは言った:「...要素が画面に表示されないので、それをクリックするための計算を行うことはできません...」。ええと、「それ」は数学をすることはできませんが、「あなた」はできます。;)クリックしたい要素の位置を取得し、それを表示するために上下にスクロールする必要があるピクセル数( X )を計算できます。次に、ページをXピクセルずつ自動スクロールし、X値を使用して要素の現在の位置を計算し、そこをクリックします。左または右にスクロールする必要がある場合も、同じロジックが使用されます。Yを使用するだけ水平補正値としてのピクセル。私はこれを別の言語で行いましたが、それが実行可能であり、正常に機能することを知っています。:)

編集:(2013年2月21日)

OK、私は自分のプロジェクトの1つでもこれを行わなければなりませんでした。それで、私が上で意味したことを説明するために、以下は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 に答える
7

電話はうまくいくはずだと思いますel.evaluateJavaScript("click()");。過去に「クリック」引数を使用して成功していたので、うまくいくはずだと言います。QWebElement::function()ただし、このメソッドはQWebElementAPIの一部にはなりませんでした。著者は、の存在下では不要であると結論付けたと思いますQWebElement::evaluateJavaScript()

私の同様の質問-QWebKitのリンクをたどる方法は?-まだ答えがありません:(
私はここであなたと同じ回避策を思いつきました-evaluateJavaScript ()の問題

于 2010-04-17T01:15:12.127 に答える
1

Webviewボタンをクリックしたい人のためにこれらを行います

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