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

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

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

那是因为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_prefix_开头的id的链接。

 css=a[id$='_id_sufix'] 

具有以文本_id_sufix结尾的id的链接。

 css=a[id*='id_pattern'] 

包含文本id_patternid的链接。

您使用的是后缀,我假设它不是您应该使用的部分链接文本标识符(除非我看到您的html,这意味着下次尝试显示您的HTML)。 *=在任何情况下都是可靠的。

尝试使用

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

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

无论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("")) 

对于我为v1和v2提到的控件ID,我使用如下:

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

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

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