在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_pattern
的id
的链接。
您使用的是后缀,我假设它不是您应该使用的部分链接文本标识符(除非我看到您的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 )=" "]