2013-12-16 58 views
2

我无法在谷歌搜索后得到满意的答案。 那么你能指导我吗? 我有一个包含李,一个标签下面的div。 我能够通过它的类名找到使用CssSelector的div。 现在在这个div里我想用它的文本标签,然后点击它。 标签是贝洛:C#硒webdriver css选择器只有文本标签退出

<标签>注销< /标签>

如何做到这一点?

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

我的解决方案:使用的foreach

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

或 :

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

但这些都不工作。

回答

8

有一个很好的理由,为什么你的CSS选择器不起作用,具体来说contains位是它跌倒的地方。为什么?

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

contains,我们都知道,爱其实是从来灒,背后jQuery.

如果你想基于文本的搜索,你要么的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"));返回的内容。

+1

非常感谢!这是一个很好的答案,你详细解释。通过进一步添加断点分析,我能够详细了解。我认为我使用foreach进行迭代的方法更适合我的需求。谢谢Arran!问候,rahoolm – rahoolm

+0

这打开了我的眼睛为我的公司寻找东西。我知道jQuery为IDE工作,但是在编写C#代码时,我遇到了问题。通过XPath定位可以让我选择我可以看到的名字。现在,如果它在页面上移动,脚本不会中断!谢谢! – IamBatman