Wil*_*ill 4 css ruby selenium google-chrome selenium-webdriver
我正在尝试使用 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>?]
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用 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)')
Run Code Online (Sandbox Code Playgroud)
Selenium::WebDriver::Error::InvalidSelectorError: 无效选择器:指定了无效或非法的选择器
有没有另一种方式来表达这个选择器?或者一种让硒做出反应的方法?
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
Run Code Online (Sandbox Code Playgroud)
也就是说,如果您尝试使用的唯一 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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2519 次 |
| 最近记录: |