14

動的に生成されたIDを持つ要素を見つけようとしています。文字列の最後の部分は定数( "ReportViewer_fixedTable")なので、これを使用して要素を見つけることができます。XPathで正規表現を使用しようとしました:

targetElement = driver.FindElement(
    By.XPath("//table[regx:match(@id, "ReportViewer_fixedTable")]"));

そして、CssSelectorによる検索:

targetElement = driver.FindElement(
    By.CssSelector("table[id$='ReportViewer_fixedTable']"));

どちらも機能しません。任意の提案をいただければ幸いです。

4

3 に答える 3

36

それは、CSSセレクターを変更する必要があるためです...

driver.FindElement(By.CssSelector("table[id*='ReportViewer_fixedTable']"))`

https://saucelabs.com/blog/selenium-tips-css-selectors-in-selenium-demystifiedから:

css=a[id^='id_prefix_']

idテキストで始まる を含むリンクid_prefix_

css=a[id$='_id_sufix']

idテキストで終わる の付いたリンク_id_sufix

css=a[id*='id_pattern']

idテキストを含むへのリンクid_pattern

使用するはずだった部分的なリンク テキスト識別子ではないと思われる接尾辞を使用していました (html を見た場合を除きます。つまり、次回 html を表示してみてください)。*=どんな状況でも信頼できます。

于 2012-08-14T22:49:55.953 に答える
2

使ってみて

targetElement = driver.FindElement(By.XPath("//table[contains(@id, "ReportViewer_fixedTable")]"));

これは、「ReportViewer_fixedTable」で終わるだけでなく、id を含むすべての要素をチェックすることに注意してください。あなたの質問に対するより正確な答えとなる正規表現オプションを見つけようとします。

于 2012-08-15T00:24:02.597 に答える
0

このソリューションは、XPath のバージョンに関係なく機能します。まず、COMMON ヘルパー クラスのどこかにメソッドを作成します。

 public static string GetXpathStringForIdEndsWith(string endStringOfControlId)
    {
        return "//*[substring(@id, string-length(@id)- string-length(\"" + endStringOfControlId + "\") + 1 )=\"" + endStringOfControlId + "\"]";
    }

私の場合、以下は私の製品の異なるバージョンのコントロールIDです::

v1.0 :: ContentPlaceHolderDefault_MasterPlaceholder_HomeLoggedOut_7_hylHomeLoginCreateUser

v2.0 :: ContentPlaceHolderDefault_MasterPlaceholder_HomeLoggedOut_8_hylHomeLoginCreateUser

次に、上記のメソッドを呼び出して、静的な終了文字列を持つコントロールを見つけることができます。

By.XPath(Common.GetXpathStringForIdEndsWith("<End String of the Control Id>"))

v1 と v2 について言及したコントロール ID については、次のように使用します。

By.XPath(Common.GetXpathStringForIdEndsWith("hylHomeLoginCreateUser"))

全体的なロジックは、以下の XPath 式を使用して、特定の文字列で終わるコントロールを見つけることができるということです。

//*[substring(@id, string-length(@id)- string-length("<EndString>") + 1 )="<EndString>"]
于 2015-01-14T10:42:40.787 に答える