C#Selenium Web驱动程序和CSS:起点

时间:2016-12-28 22:11:08

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

我有下一个标签结构:

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

我做了以下事情:

IWebDriver _driver;

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

注意,我需要以这种方式找到嵌套元素:首先我找到父标记,然后我使用parent作为起始点来查找嵌套的。 但是当我使用逻辑错误的定位器(“父嵌套”,因为“父嵌套”一起是错误的定位器)时,parent.FindElement 返回(!)我更正IWebElement,就像我从DOM模型的顶部。

有趣的是,当我做的时候

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

它会抛出元素未找到异常。

我认为我理解错误或者只是不知道什么。它是如何工作的?如何避免“父母嵌套”的问题?

2 个答案:

答案 0 :(得分:3)

我认为你在使用错误的方式就是为什么你会收到错误

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

你在这里 -

  

“首先查找父标记,然后我使用parent作为查找的起点   父标签本身“

这是错误的。可以有不同的方法来实现这个目标 -

  1. 将父标记作为起始点并查找子标记 -
  2. var child= driver.FindElement(By.Css("parent")).FindElement(By.Css("nested"));

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

答案 1 :(得分:2)

  

cssSelectors将从右到左进行评估。

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

在你的情况下,

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?