我试图找到一个动态生成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']"));
两者都不起作用。任何建议将不胜感激。
答案 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 + "\"]";
}
就我而言,下面是我的产品::
的不同版本中的控件IDv1.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>"]