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(“par‌​ent nested“
    将子项作为父标记的“嵌套”查找,这样无论您是通过.Css(“父嵌套”)
    查找子项,还是通过make parent作为起点,然后移动到child-like
    var 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"));