2016-12-28 104 views
2

我的下一个标签结构:C#硒网络驱动程序和CSS:起点

<body> 
    <parent> 
     <nested/> 
    </parent> 
</body> 

我做以下的事情:

IWebDriver _driver; 

var parent = _driver.FindElement(By.Css("parent")); 
var nested = parent.FindElement(By.Css("parent nested")); 

通知,我需要找到嵌套元素只能这样:起初我找到父母标记,然后我用父母作为起点找到嵌套的一个。 但是,当我使用逻辑错误的定位器(“父亲嵌套”,因为一起“父母亲嵌套”是错误的定位器),parent.FindElement 返回(!)我正确的IWebElement,就像如果我从DOM模型的顶部搜索。

有趣的是,当我做

var nested = parent.FindElement(By.Css("parent")); 

它抛出未发现异常的元素。

我想我明白了一些错误或者只是不知道什么。它是如何工作的?我怎样才能避免“父母嵌套”的问题?

回答

2

cssSelector将从右到左进行评估。

这意味着第一个孩子将被评估,然后检查他们的父母是否存在。

在你的情况,

var nested = parent.FindElement(By.Css("parent nested")); 

第一,检查nested元素是否存在于DOM(这里,嵌套元素)一个孩子。如果存在,则检查parent是否是其父项。

var nested = parent.FindElement(By.Css("parent")); 

这里,parent将被检查是否是给定的元素(调用父)的孩子。但事实并非如此。所以,给NoSuchElementException

参考:

  1. Why do browsers match CSS selectors from right to left?
+0

谢谢你和@NarendraRajput –

3

我觉得这里使用的是错误的方式这就是为什么你得到错误

var nested = parent.FindElement(By.Css("parent")); 

在这里,你正在做的 -

“首先找到父标签,然后我用父母为起点找到 亲本标签本身“

这是错误的。可以有不同的方式来得到这个 -

  1. 化妆父标签作为起点,找到子标签 -

var child= driver.FindElement(By.Css("parent")).FindElement(By.Css("nested"));

  • 直接找到子标签 -
  • var child= driver.FindElement(By.Css("parent nested"));

    +0

    你是对的,但如果你VAR孩子= driver.FindElement(By.Css( “母公司”))FindElement(通过.Css(“父嵌套”)); (看看第二个定位器),无论如何你会得到一个正确的元素。我只是想明白为什么。 –

    +1

    因为'By.Css(“par ent nested”)'找到父子标签为“嵌套的”父标签,所以无论你是否可以找到该子子码都是By.Css(“父嵌套”)'或者可以通过将父项作为起始点移动,然后移动到子项,如'var child = driver.FindElement(By.Css(“parent”))。FindElement(By.Css(“par ent nested”));'indirect它也发现了子子元素。 – NarendraR

    +0

    'Css(“parent nested”)'是xpath(“//父//嵌套”)的替代方法''你也要用这种方式定位嵌套元素 – NarendraR