C#Selenium Web驱动程序和CSS:起点
我有下一个标签结构:C#Selenium Web驱动程序和CSS:起点,c#,selenium,selenium-webdriver,css-selectors,webdriver,C#,Selenium,Selenium Webdriver,Css Selectors,Webdriver,我有下一个标签结构: <body> <parent> <nested/> </parent> </body> 注意,我只需要这样查找嵌套元素:首先我查找父标记,然后我使用父标记作为查找嵌套元素的起点。 但当我使用逻辑错误的定位器(“父嵌套”,因为“父-父嵌套”一起是错误的定位器)时,parent.FindElement返回(!)me correct IWebElement,就像我从DOM模型顶部搜索一样 有趣
<body>
<parent>
<nested/>
</parent>
</body>
注意,我只需要这样查找嵌套元素:首先我查找父标记,然后我使用父标记作为查找嵌套元素的起点。
但当我使用逻辑错误的定位器(“父嵌套”,因为“父-父嵌套”一起是错误的定位器)时,parent.FindElement返回(!)me correct IWebElement,就像我从DOM模型顶部搜索一样
有趣的是,当我
var nested = parent.FindElement(By.Css("parent"));
它抛出元素未找到异常
我想我理解错了什么,或者只是不知道什么。它是如何工作的?如何避免“父-父嵌套”的问题?我认为您在这里使用了错误的方法,这就是为什么会出现错误的原因
var nested = parent.FindElement(By.Css("parent"));
这是你正在做的-
“首先查找父标记,然后我使用父标记作为查找的起点
“父标记本身”
这是错误的。可以有不同的方法来实现这一点-
var child=driver.FindElement(By.Css(“父”)).FindElement(By.Css(“嵌套”))代码>
直接查找子标记-
var child=driver.FindElement(By.Css(“父嵌套”)代码>
CSS选择器将从右向左进行评估
这意味着将评估第一个子项,然后检查其父项是否存在
就你而言
var nested = parent.FindElement(By.Css("parent nested"));
首先,检查nested
元素是否作为子元素存在于DOM中(这里是nested元素)。如果存在,则检查父项
是否为其父项
及
在这里,parent
将检查它是否是给定元素的子元素(调用parent)。但事实并非如此。因此,给出了NoTouchElementException
参考:
您是对的,但是如果您执行var child=driver.FindElement(By.Css(“父”)).FindElement(By.Css(“父嵌套”));(查看第二个定位器)无论如何,您都会得到正确的元素。我只是想知道为什么。因为By.Css(“parent nested“
将子项作为父标记的“嵌套”查找,这样无论您是通过.Css(“父嵌套”)
查找子项,还是通过make parent作为起点,然后移动到child-likevar child=driver.FindElement(By.Css(“父”).FindElement(By.Css(“par”)).FindElement(By.Css(“par”)(),代码>间接地,它也在查找子元素。Css(“父嵌套”)
是xpath(“//parent//nested”)
的替代方法,因为您将以这种方式定位嵌套元素,从而使您和@narendrajput都能找到嵌套元素
var nested = parent.FindElement(By.Css("parent nested"));
var nested = parent.FindElement(By.Css("parent"));