【问题标题】::eq pseudo selector not working with Selenium WebDriver / Chrome:eq 伪选择器不适用于 Selenium WebDriver / Chrome
【发布时间】:2015-02-11 02:45:44
【问题描述】:

我正在尝试使用 selenium 中的 css 选择器从网站获取给定类的前两个 div。我将使用 SO 来演示这个问题。如果我在控制台 chrome 开发工具中尝试选择器,它可以工作:

$('div.question-summary:eq(0)')
[<div class=​"question-summary narrow tagged-interesting" id=​"question-summary-27442616">​…​</div>​]
$('div.question-summary:eq(1)')
[<div class=​"question-summary narrow tagged-interesting" id=​"question-summary-27442177">​…​</div>​]

但如果我使用 selenlium webdriver 执行以下操作,我会收到错误:

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.navigate.to('http://www.stackoverflow.com')
first_element = driver.find_element(:css, 'div.mainnav:eq(0)')

Selenium::WebDriver::Error::InvalidSelectorError: 无效选择器:指定了无效或非法的选择器

还有其他方式来表达这个选择器吗?还是让硒响应它的方法?

【问题讨论】:

    标签: css ruby google-chrome selenium selenium-webdriver


    【解决方案1】:

    :nth-child 可以得到类似的结果:

    first_element = driver.find_element(:css, 'div.question-summary:nth-child(0)')
    

    请注意difference between :eq and :nth-child

    【讨论】:

      【解决方案2】:

      Selenium 使用浏览器的原生 CSS 选择器引擎。因此,find_element 方法将 jQuery 选择器(在本例中为 :eq(0))视为无效。

      如果您想使用 jQuery 选择器,您需要使用 execute_script 方法手动执行该脚本。请注意,当使用这种方法时,将返回一个 Selenium::WebDriver::Element 数组,这就是使用 .first 的原因(以获取数组的第一个元素)。

      first_element = driver.execute_script('return $("div.question-summary:eq(0)");').first
      

      也就是说,如果您尝试使用的唯一 jQuery 选择器是 :eq,您可以使用标准 CSS 选择器。 :eq 选择器返回匹配集中的特定元素。您可以使用find_elements[] 方法来做同样的事情:

      first_element = driver.find_elements(:css, 'div.question-summary')[0]
      second_element = driver.find_elements(:css, 'div.question-summary')[1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多