3

Selenium テストで Xpath コードを実行する方法はありますか? JavaScript を実行できることは知っていますが、単にページ上の要素を見つけるだけでなく、いくつかの Xpath コードを実行する方法を探しています。

誰でもこれに遭遇しますか?

4

5 に答える 5

2

XPath 関数が XPath 2.0 の一部であることは理解しています。Selenium は 2.0 をサポートしていません。したがって、セレンで XPath 関数を実行することはできません。

于 2009-03-05T17:55:57.803 に答える
1

受け入れられた答えは間違っていると思います。私は現在、Java を使用して Selenium WebDriver を学習しており、次のブログ投稿を参照して、変数 xpath を管理するために Selenium 2 で XPath 関数を実行する方法を学びました。私はこれがあなたが探しているものだと信じています。

http://automationtricks.blogspot.com/2010/09/how-to-use-functions-in-xpath-in.html

于 2012-04-09T22:53:30.167 に答える
0

アンドリュー、興味深い質問。おそらく私が現在StackOverflowにたむろしている唯一のSelenium開発者なので、SeleniumDevelopersフォーラムまたはAdvancedUsageForumを試してみることをお勧めします:)

そうは言っても、私はあなたがこれを行うことができると確信していますが、私は今あなたにコードを取得することはできません(Seleniumソースを持たないラップトップ上で)。「ブラウザボット」へのハンドルを取得する必要があります(その方法については、任意のJSコードを実行する例を参照してください)。そこから、必要なもの、つまりSeleniumのXPath抽象化への呼び出しを取得できる関数呼び出し(または呼び出しのチェーン)が存在する可能性があります。

または、Firefoxのみをサポートしても問題がない場合は、JSコードを検索してFirefox XPathクエリを実行し、それを呼び出します。storeEvalタイプのコマンドに組み込むのはかなり簡単です。または、SeleniumがSeleniumのJSライブラリと一緒にXPathライブラリを挿入することを忘れないでください。直接呼び出すこともできます。Seleniumがいくつかの単純なXPath式に提供するショートカットと抽象化を取得することはできませんが、それは機能すると確信しています。

あなたがやろうとしていることを共有できますか?一般に、要素から属性またはテキスト値を取得しようとすると、このようなことが起こります。

于 2009-02-17T15:26:46.233 に答える
0

W3C XPath 1.0 仕様によると、XPath 1.0 には関数のサポートがありますが、使用できる関数のセットはかなり限られています: http://www.w3.org/TR/xpath#section-String-Functions

特に「end-with」機能は利用できません-私は次のような表現を使用します

//input[substring(@id, string-length(@id) - string-length('<idSuffix>') +1) = '<idSuffix>']

回避策として (この場合は、id で終わる入力要素を検索します'<idSuffix>')。

于 2009-03-26T11:57:25.820 に答える
0

Selenium 1.0.1 リリースの htmlutils.js ファイルの 1177 行を見てください (これは、すべての XPath クエリを処理する eval_xpath() 関数内にあります)。

    var result = xpathResult.iterateNext();

ここでの問題は、XPathResult の仕様によると、結果の型が反復可能なノードのセットでない場合、iterateNext() が例外をスローすることです。Selenium は、すべての XPath クエリの結果がノード セットになると盲目的に想定しているため、数値または文字列を返すクエリを実行することはできません。

できることは、1177 ~ 1181 行を次のように置き換えて htmlutils.js を変更することです。

    var iterable =
     xpathResult.resultType == xpathResult.ORDERED_NODE_ITERATOR_TYPE ||
     xpathResult.resultType == xpathResult.UNORDERED_NODE_ITERATOR_TYPE;

    if (iterable) {
     var result = xpathResult.iterateNext();
     while (result) {
         results.push(result);
         result = xpathResult.iterateNext();
     }
    } else if (xpathResult.resultType == xpathResult.NUMBER_TYPE) {
     results.push(inDocument.createTextNode(xpathResult.numberValue));
    }

アイデアは、数値が表示された場合、それを DOM TextNode 内にラップして、通常どおりに渡すというものです。これは、Selenium に関する限り、多かれ少なかれ透過的な変更です。Selenium の getText コマンドには、TextNode の特別な処理 (テキスト コンテンツを文字列として返す) があるため、次のようなことができるようになりました。

int count = Integer.parseInt(selenium.getText("xpath=count(//td) + 1"), 10);

私のように SeleniumRC Java クライアントを使用している場合、selenium は DefaultSelenium のインスタンスですもちろん、これは簡単な例です。これは、getXpathCount() を使用しただけで、他の XPathResult タイプも処理できるためです。

また、上記の特定の行は、XPath クエリのブラウザー ネイティブ実行のみを対象としていることにも注意してください。Selenium の組み込み XPath ライブラリを使用した実行は、直後に eval_xpath() 内で処理され、おそらく同様の変更が必要になりますが、これについてはまだ調べていません。

于 2009-09-30T22:46:03.720 に答える