使用 Nokogiri 和 Selenium,如果驱动程序无法执行某个命令,是否可以跳过它?

Using Nokogiri and Selenium, is it possible to skip a command if the driver is unable to perform it?

我正在尝试在我的网站上自动执行某项操作。每隔一段时间,我希望机器人访问某些页面并单击一个元素。有时,这个元素不存在,这会破坏整个事情,因为机器人不知道该怎么做。理想情况下,我想记录元素不存在的次数,但至少我希望机器人跳过该页面并继续前进。

这是我目前的情况:

require "selenium-webdriver"
require "nokogiri"
driver = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(:timeout => 19)


User.all.each do |u|
  driver.navigate.to "http://website.com/" + u.name
  driver.find_element(:class, "like").click #THIS IS THE LINE THAT SOMETIMES FAILS
end
browser.close

所以理想情况下,代替 driver.find_element(:class, "like").click,我想要这样的东西:

if element(:class, "like").exists?
  driver.find_element(:class, "like").click
else
  u.error = true
  u.save
end

这可能吗?

这里确实是一个简单的修复:

拿这个:

  driver.find_element(:class, "like").click

如果您的 Ruby 是 2.3 或更高版本

,请将其更改为
  # the &. here is the 'safe navigation operator'
  driver.find_element(:class, "like")&.click

或旧版本的 ruby:

  element = driver.find_element(:class, "like")
  element.click if element

或者当你在做一些条件数据库逻辑时的情况:

  element = driver.find_element(:class, "like")
  if element
    # do something in the database
  else
    # something else in the database
  end

更一般地说,您可以使用典型的 Ruby 控制流程来跳过 nokogiri / 命令。检查数组是否为空,检查键是否存在等。如果您预见到会引发错误,请挽救该特定错误。

按照@max pleaner 的建议,您可以挽救有关未找到该元素的异常,然后对该信息执行一些操作。在这种情况下,您正在寻找的例外是 NoSuchElementError.

代码可能如下所示:

User.all.each do |u|
  driver.navigate.to "http://website.com/" + u.name
  begin
   driver.find_element(:class, "like").click #THIS IS THE LINE THAT SOMETIMES FAILS
  rescue Selenium::WebDriver::Error::NoSuchElementError
    u.error = true
    u.save
  end
end

yes.itspossible.try以下代码

User.all.each do |u|
  driver.navigate.to "http://website.com/" + u.name
if driver.find_elements(:class, "like").count > 1
  driver.find_element(:class, "like").click
end
end

你也可以通过ruby中的异常处理来保证连续性,比如begin rescue ensure