为什么`nth-of-type`在不同的浏览器版本中表现不同?

时间:2017-08-02 09:22:44

标签: selenium css-selectors automated-tests ui-automation

问题:

因此,当应用于未在选择器中指定标记类型的元素时,:nth-of-type选择器的行为会遇到一种特殊的差异。

采用以下 HTML

<div class="parent-class">
    <header>...</header>
    <div class="child-class">...</div>
    <div class="child-class">...</div>
</div>

现在,这个选择器

.parent-class .child-class:nth-of-type(1)

应该指向第一个子div元素,它在 Chrome 59 Firefox 54 中执行,但不在Mink-drived Selenium浏览器中( Chrome 53 来自selenium / hub:3.0.1-fermium和 Firefox 50 来自selenium / node-firefox-debug:2.53.0)。

nth-of-type在这些浏览器中做的是完全忽略元素类型 - 这意味着,要使选择器工作,必须指定:

.parent-class .child-class:nth-of-type(2)

.parent-class div.child-class:nth-of-type(1)

问题:

为什么在Selenium浏览器中会忽略元素类型?

2 个答案:

答案 0 :(得分:2)

不知道Selenium与:nth-of-type()有问题。也许这是Mink的一个错误,因为这种行为显然不正确 - :nth-of-type()不应该要求类型选择器工作,如我的回答here中所述。

答案 1 :(得分:1)

这是Symfony的CssSelector组件的限制,Mink使用

Mink使用CssSelector将元素翻译为xpath,这可由驱动程序解释。

这个工具根本不完全支持几种类型的CSS选择器,实际上在official documentation中说明了:

  

尚不支持几个伪类:

     

*:first-of-type,*:last-of-type,*:nth-​​of-type,*:nth-​​last-of-type,*:only-of-type。 (这些使用元素名称(例如li:first-of-type)但不包含*。