2

これは私を夢中にさせています。要素を右クリックするためにWebDriverが必要なだけで、残りのセレンは機能します。

私は Eclipse を使用しています。すべての .jar インポートとライブラリが正しくセットアップされています。

WebDriver driver = new FirefoxDriver();
String baseUrl = "http://............/";
selenium = new WebDriverBackedSelenium(driver, baseUrl);

コードのかなり後の方で、問題なく右クリックを実行したい JavaScript ポートレットの行内を左クリックします。

selenium.click("//tr[@id[contains(.,'Equipment')]]");

それは問題なく動作し、クリックされた行が強調表示されます。

今はそれを右クリックする必要がありますが、できません! しようとしている:

selenium.contextMenu("//tr[@id[contains(.,'Equipment')]]");

右クリックに失敗し、次のエラーが返されます: java.lang.UnsupportedOperationException: contextMenu.

その行が右クリックされるまで「可視」と見なされない要素があります。既存のものとして検出されていますが、WebDriver で実行中に自分で手動で右クリックして表示しない限り、セレンは実行しません。それ以外の場合は、次のようになります。

com.thoughtworks.selenium.SeleniumException:Element は現在表示されていないため、操作できない可能性があります。

その行を右クリックすると、要素が「見える」ようになります。そのため、セレンの右クリックがひどく必要です。目に見えない要素が存在するものとして検出されていることを確認するためにテストしました。

boolean exists = selenium.isElementPresent("//a[@id[contains(.,'faction')]]");
boolean visible = selenium.isVisible("//a[@id[contains(.,'faction')]]");
System.out.println("Exists: " + exists);
System.out.print("Visible: " + visible);

私に与えます

Exists: true
Visible: false

つまり、私の xpath の問題ではありません。それはそこにある。「目に見えない」だけです。右クリックの代わりに Shift+F10 も送信しようとしましたが、うまくいきません。

これはすべて Selenium IDE で正常に動作しますが、Java で操作できるように WebDriver で動作させる必要があります。私を助けてください。

編集: Slanec のアドバイスのおかげで、さらにアクション ビルダーをいじってみたところ、私のセレン Web ドライバーが Firefox 14 に対応していないことが問題であることがわかりました。先週の木曜日に最新のものをダウンロードしたと思っていたことを考えると、奇妙で​​す。 . いずれにせよ、明らかに Firefox 14 のネイティブ イベント サポートは webdriver 2.25.0 まで追加されませんでした。私は 2.24.1 を使用しています。

4

2 に答える 2

2

残念ながら、ソース コードを見ると、contaxtMenu() WebDriver エミュレーションにはメソッドが追加されていません。org.openqa.selenium.internal.seleniumemulation他のすべてのメソッド (コマンドパターンを介して偽装されたクラス) が置かれているパッケージには存在しません。ほとんどの場合、導入されたときにバックポートされていませんWebDriverBackedSeleniumでした (Selenium RC は非推奨であり、活発に開発されていないことを覚えていますか?)。

あなたが試すことができること:

  1. 可能であれば、Selenium RC を取り除きます。WebDriver API は、はるかにクリーンで強力で、積極的に開発されています :)。WebDriver でそれを行うには、次のようにします。

    WebElement elem = driver.findElement(By.xpath("//tr[@id[contains(.,'Equipment')]]"));
    new Actions(driver).contextClick(elem).perform();
    
  2. 作成した WebDriver オブジェクトでこのタスクだけを実行してから、Selenium の使用に再度フォールバックしてください。上記の 2 行のコードは、Selenium コードの間に挿入するだけで機能するはずです。

  3. 自分で実装してください。それほど難しくありません。org.openqa.selenium.internal.seleniumemulationパッケージとWebDriverCommandProcessorクラスを見て、contextMenu()上記のようにメソッドを追加してください。これは、編集したソース コードから独自の Selenium ビルドを作成することを意味しますが、そうではありません。

  4. 最後の手段 - 非表示の要素が待機しているアクションを正確に把握し、fireEvent()メソッドを介してイベントをシミュレートします。次のことを行うと、うまくいくはずです (そうでない場合は、別のイベントを待っているだけです)。

    fireEvent("//tr[@id[contains(.,'Equipment')]]", "contextmenu")
    

補足として、長いのではなく

"//tr[@id[contains(.,'Equipment')]]"

または少し良い

"//tr[contains(@id,'Equipment')]"

あなたはこれを書くことができます:

"css=tr[id*='Equipment']"

少し良くて読みやすくなりませんか?私も XPath にはとても慣れていますが、いくつかの基本的な CSS セレクター (ほとんどのことはできますが、すべての XPath ができるわけではないことは間違いありません) を学ぶことはそれほど怖くありません...

于 2012-07-21T07:55:46.103 に答える
0

selenium.contextMenuAt を試すことができるかもしれません

于 2012-07-21T05:52:56.537 に答える