在C#中使用Selenium通过部分id查找元素

时间:2012-08-14 21:39:53

标签: c# regex selenium

我试图找到一个动态生成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']"));

两者都不起作用。任何建议将不胜感激。

3 个答案:

答案 0 :(得分: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)。 *=在任何情况下都是可靠的。

答案 1 :(得分:2)

尝试使用

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

请注意,这将检查所有包含id的元素(并且不仅仅以' ReportViewer_fixedTable'结尾)。我将尝试找到一个正确的选项,以便更准确地回答您的问题。

答案 2 :(得分: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&amp; amp;提到的控制ID v2,我使用如下:

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

总的逻辑是,您可以使用下面的XPath表达式来查找以特定字符串结尾的控件:

//*[substring(@id, string-length(@id)- string-length("<EndString>") + 1 )="<EndString>"]