C#selenium webdriver css选择器,用于标签,只有文本注销

rah*_*olm 2 c# selenium css-selectors selenium-webdriver

在google上搜索后,我无法得到满意的答案.你能指导我吗?我有一个div,其中包含li,a,标签.我可以通过其类名使用CssSelector找到div.现在在这个div中,我希望得到一个带有文本的标签,然后点击它.标签如下:

<label>退出</ label>

怎么做 ?

我有一个使用XPath的工作解决方案并迭代div中的所有标签,但我无法使用CssSelector获取它.

我的解决方案

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

或者使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用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']"));
Run Code Online (Sandbox Code Playgroud)

但这些都行不通.

Arr*_*ran 11

有一个很好的理由说明你的CSS选择器不起作用,特别contains是它是它落后的地方.为什么?

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

contains我们都知道,爱其实是从哪里来,背后的CSS选择器引擎的jQuery.

如果你想要基于文本的搜索,你将要么必须使用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']"));
Run Code Online (Sandbox Code Playgroud)

应该:

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

(注意XPath中的".")

此外,你的foreach循环应该有效,因此你必须在那里放一个断点并确切地检查返回的内容menu.FindElements(By.TagName("label"));.

  • 多谢!这是一个非常好的答案,您解释得很详细。通过进一步添加断点分析,我能够详细理解。我认为我使用foreach进行迭代的方法更适合我的需求。谢谢阿兰!问候,拉胡尔姆 (2认同)