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")]"));

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

于 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 回答