2016-04-08 13 views
2

ブラウザ上に表示されない可能性のあるページ上の要素にgeb webdriverを移動させるにはどうすればよいですか。要素がページ上に存在し、表示されますが、要素がページの下部に表示される可能性があり、ブラウザをスクロールして要素を表示する必要があります。一例として、このページを使用してブラウザウィンドウに表示されないgebページのコンテンツに移動するには?

import geb.Page 
class myPage extends Page { 
    static url = "mypage.xhtml" 
    static at = {title == "myPage"} 
    static content = { 
    someElement = {$("#bottomOfPage")} 
    anotherElement = {$(".someClass",5)} 
    } 

    void clickElement(){ 
    //possibility to fail because element may not be displayed in browsers view 
    //if not in view, scroll to element, then click 
    someElement.click() 
    } 
} 

、要素はページ上の表示ではなく、おそらく一番下にした場合、どのように私はビューに要素を持ってwebdriverをを伝えることができますか?私はページの内容が見えないときに失敗するいくつかの複雑なテストを持っています。場合によっては、ドライバが表示されていなくても要素に移動します。しかし、私はそれがそれ自身で動かないケースのために見えないならば、要素に移動するようにドライバに明示したいと思います。

セレンライブラリにはmoveToElement()関数がありますが、WebElementクラスのオブジェクトのみを受け入れます。 gebを使用すると、ページクラスを作成するときに、テストで使用されるすべての要素がコンテンツセクションで宣言されるため、SimplePageContentクラスになります。 SimplePageContentをWebElementにキャストすることもできません。 moveToElement(By.id("bottomOfPage"))は機能しますが、ハードコーディングされた値を必要としないので理想的ではありません。 Idでは、できるだけ多くの場合ページコンテンツオブジェクト自体を渡すことが多い。

+0

私はあなたがあなたのページのオブジェクトクラスにメソッドmoveToElementを追加しなければならないと思います。このメソッドはJavaScriptExecutorを使用してJSを実行し、オブジェクトの位置までスクロールします。 [this post]で上/下にスクロールする方法を参照してください(http://stackoverflow.com/questions/12293158/page-scroll-up-or-down-in-selenium-webdriver-selenium-2-using-java) – Buaban

答えて

3

私の経験から、WebDriverに現在表示されていない要素をクリックするように要求すると、最初にその要素にスクロールしてからそれをクリックすると言います。そうでない場合や、要素が表示されていないという事実があなたの要素がクリックされない原因ではない場合には、何らかのバグを起こしているかのどちらかです。

それでもActions.moveToElement()を使用して明示的要素に移動したい場合、あなたは簡単にオブジェクトが最初に取得したい場合に使用すべきfirstElement()が付属しています彼らはNavigatorを実装しているという事実を使用してコンテンツ定義から返さ変えることができますNavigatorにちょうど1つのWebElementがある場合は、NavigatorまたはsingleElement()WebElementがあります。

あなたNavigator sからWebElement Sを抽出する必要はありませんもっと簡単な方法もあります - interact {}ブロックを使用します。

interact { 
    moveToElement(someElement) 
} 
+0

うーん、私はすぐに見えなかった要素をクリックしようとする簡単なテストを行い、あなたは正しいです。要素にスクロールしてをクリックします。私はテキストフィールドに値を入力することについての私の質問の例を作ったはずです。私は自分のコードを振り返り、テキストボックスが表示されていないときは値を入力せず、テストに失敗します。私はinteract {}を使って調べましたが、いつも "moveToElement 'というシンボルを解決できません。"輸入する必要があるものはありますか? – WontonJon

+0

また、テキストボックスが表示されていないという事実によって、テキストボックスにテキストが入力されてはいけません。テキストボックスについて特別なことはありますか?値がテキストボックスに入れられていないことを確かめますか?インタラクションについての質問 - あなたが得ている完全なスタックトレースは何ですか?どうやって使ってるの?テスト、ページ、またはモジュールで? – erdi

+0

スタックトレースエラーは発生しません。要素はテキストボックスである入力フィールドだけです。私のテストはフォームを記入します。ブラウザウィンドウに表示されるテキストボックスは値を受け取りますが、ブラウザビューには表示されないテキストボックスは埋められません。ブレークポイントを使用している場合でも、ブレークポイントが満たされていることを示します。 theyreがスキップされているかのようです。私はアクションを使ってヘルパー関数を作成しました。明示的に頑固なテキストボックスに移動するmoveToElement()メソッドは、それが動作しました。それは本当に奇妙な笑です。今のところこれは合理的な解決策です。 – WontonJon