2

私は最近 Selenium を使い始めましたが、Selenium 2 / WebDriver のみを使用することにしました。私のテスト コードでWebElementは、ページ内のどこにあるかわからないまま a にたどり着くことがよくあります。

WebElement を指定すると、それを一意に選択する XPath 式を構築するコードが必要です。

Selenium 用の FireFox レコーダー プラグインがこれを行います。私が欲しいのは、Selenium 2 でそれを行うコードです。

を使ってツリーをたどり、元WebElementの子を見つけることで、そのようなコードを自分で書くことができますが、高速で (繰り返し呼び出すのは悪いように思えます) 完璧なもの (たとえば、名前空間のため)を思いつくのは自明ではありません。findElementfindElementsBy.xpath

(関連する質問では、代わりに CSS セレクターを使用することを提案しています。それで問題ありません。)

誰かが私のためにこれをしましたか?最善のアプローチは何ですか?

4

3 に答える 3

2

それは非常に簡単です:そしてところで、cssは進むべき道です。xpathは、最後の手段としてのみ使用する必要があります。http://sauceio.com/index.php/2010/01/selenium-totw-css-selectors-in-selenium-demystified/は、ここで提供されているスペースよりもはるかに詳細にcssロケーターについて説明しています。

最善のアプローチ:FirefoxダウンロードFirebugを使用している場合は、HTMLを確認できます。cmd + Shift + cを押すと、要素の蛍光ペンが表示されます。あなたのhtml要素を見つけてください、多分それはこのように見えるでしょう

<input type="submit" tabindex="110" value="Post Your Answer" id="submit-button">

次に、要素を非常に簡単に見つけることができます

WebElement element = driver.findElement(By.cssSelector("input[id='submit-button']"))

タグ名を最初に「input」、次に角かっこ「input [id='submit-button']」内にある種の一意の識別子を配置していることに注意してください。ほとんどの場合、これは使用するすべてのcssロケーターの75%をカバーします。他の25%は、ページの上部に配置したリンクでカバーされているもう少しトリッキーなものを必要とします。

http://release.seleniumhq.org/selenium-remote-control/0.9.2/doc/dotnet/Selenium.htmlで説明されているように、「id以外にどのような種類の一意の識別子を使用できますか」とよく尋ねることができます。

頑張って始めましょう

編集

そもそも要素を見つけて頑張ってください...必要に応じて、input [id *='submit']のような部分的なロケーターテキストで要素を検索できます。これを使用すると、要素ごとに変化しないロケーターの一部として部分的なテキストを使用する場合に、動的に生成される要素に役立ちます。

htmlツリーを歩いているとおっしゃっていましたが、最初に質問を読んだときは、おそらくそれがわかりませんでした。手元にある問題にぶつかったと思います。htmlツリーを上に歩くと、テストがhtmlの変更に対してより脆弱になるため、お勧めできません。また、長期的にはコードが読めなくなります。一般に、IDが欠落しているか予測できない場合は、projに相談することをお勧めします。開発者に実際に自動化できるコードを作成させることに関する管理(例:重要な要素に識別子を実装する)。これにより、長期的には実際にあなたと開発者の両方の労力を大幅に節約でき、テストの速度と信頼性も向上します。

于 2012-08-16T19:27:27.547 に答える
2

たぶんこれが役立つでしょう:私はIDが動的に生成されるWebサイトをテストしているので、IDは常に変化します。xpath を取得して操作するために、次の関数を使用します。

    /**
 * Gets the absolute xPath for elements with dynamic ids.
 * 
 * @param driver - the current WebDriver instance
 * @param element - the element for which the xPath will be found
 * @return the absolute xPath for this element
 */
public static String getElementXPath(WebDriver driver, WebElement element) {
    return (String)((JavascriptExecutor)driver).executeScript(
            "gPt=function(c)" +
            "{" +
            "if(c.id!=='')" +
            "{return c.tagName + '[@id=\"'+c.id+'\"]'}" +
            "if(c===document.body)" +
            "{return c.tagName}" +
            "var a=0;" +
            "var e=c.parentNode.childNodes;" +
            "for(var b=0;b<e.length;b++)" +
            "{var d=e[b];" +
            "if(d===c)" +
            "{return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}" +
            "if(d.nodeType===1&&d.tagName===c.tagName)" +
            "{a++}" +
            "}" +
            "};" +
            "return gPt(arguments[0]);", element);
}
于 2012-08-17T12:00:52.873 に答える
0

ID を使用して送信ボタンを見つけることができます。

1.driver.findElement(By.id("送信ボタン"))

ID > 名前 > CSS > XPATH

于 2014-04-07T05:25:28.823 に答える