【问题标题】:C# selenium webdriver css selector for label with only text Sign OutC# selenium webdriver css 选择器,用于仅带有文本的标签
【发布时间】:2014-01-03 14:52:36
【问题描述】:

我在谷歌上搜索后无法得到满意的答案。 那么你能指导我吗? 我有一个包含 li,a,labels 下面的 div。 我可以通过类名使用 CssSelector 找到 div。 现在在这个 div 中,我想获得一个带有文本的标签,然后单击它。 标签如下:

怎么做?

我有一个使用 XPath 并遍历 div 内所有标签的工作解决方案,但我无法使用 CssSelector 获得它。

我的解决方案:

IWebElement menu = CurrentDriver.FindElement(By.CssSelector("div[class='menu-panel right']"));
IWebElement logoutLabel = menu.FindElement(By.XPath("//label[text()='Sign Out']"));

或 通过使用 foreach:

var coll = menu.FindElements(By.TagName("label"));
foreach (var label in coll)
{
  if(label.Text.Trim() =="Sign Out")
  {
      Log("Sign out was found.");
      label.Click();
      break;
  }
}

我尝试使用 CssSelector:

IWebElement logoutLabel = menu.FindElement(By.CssSelector(":contains('Sign Out')"));
IWebElement logoutLabel = menu.FindElement(By.CssSelector("label:contains('Sign Out')"));
IWebElement logoutLabel = menu.FindElement(By.CssSelector("label['Sign Out']"));

但这些都不起作用。

【问题讨论】:

    标签: c# selenium css-selectors selenium-webdriver


    【解决方案1】:

    您的 CSS 选择器不起作用有一个很好的理由,特别是 contains 位是它失败的地方。为什么?

    它不是 CSS 选择器规范的一部分,因此永远不会起作用。

    我们都知道和喜爱的 contains 实际上来自 SizzlejQuery. 背后的 CSS 选择器引擎

    如果您想要基于文本的搜索,您将必须使用 XPath,或者获取这些元素的集合(使用您认为合适的任何定位器),然后在代码中过滤它们(就像您在 foreach 循环中所做的那样)。没有原生 CSS 样式的方式来执行“基于文本的搜索”。

    就您当前的代码而言,您可能还会摔倒,因为 XPath 需要一点“戳”来告诉它只搜索您当前“元素”的子元素。

    IWebElement menu = CurrentDriver.FindElement(By.CssSelector("div[class='menu-panel right']"));
    IWebElement logoutLabel = menu.FindElement(By.XPath("//label[text()='Sign Out']"));
    

    应该是:

    IWebElement menu = CurrentDriver.FindElement(By.CssSelector("div[class='menu-panel right']"));
    IWebElement logoutLabel = menu.FindElement(By.XPath(".//label[text()='Sign Out']"));
    

    (注意 XPath 中的“.”)

    此外,您的 foreach 循环应该已经工作,因此您必须在其中放置一个断点并准确检查 menu.FindElements(By.TagName("label")); 返回的内容。

    【讨论】:

    • 非常感谢!这是一个很好的答案,您详细解释了。通过进一步添加断点分析,我能够详细了解。我认为我使用 foreach 进行迭代的方法更适合我的需要。谢谢阿兰!问候,拉霍姆
    • 这让我大开眼界,为我的公司寻找东西。我知道 jQuery 适用于 IDE,但是在编写 C# 代码时我遇到了问题。能够通过 XPath 定位允许我选择我可以物理看到的带有名称的东西。现在,如果它在页面上移动,脚本就不会中断!谢谢!
    【解决方案2】:

    您正在使用:contains(),这是一个 jQuery 选择器,而不是 CSS 选择器。 显然没有办法只使用 CSS 来实现这样的事情。

    更多信息CSS selector based on element text?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多