关于ruby on rails:使用Nokogiri和Selenium,如果驱动程序无法执行,是否可以跳过命令?

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

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

这是我到目前为止所拥有的:

1
2
3
4
5
6
7
8
9
10
11
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,我喜欢以下内容:

1
2
3
4
5
6
if element(:class,"like").exists?
  driver.find_element(:class,"like").click
else
  u.error = true
  u.save
end

那可能吗?


在@max pleaner建议之后,您可以解除关于找不到元素的异常,然后对该信息执行某些操作。 在这种情况下,您要查找的异常是NoSuchElementError。

代码可能如下所示:

1
2
3
4
5
6
7
8
9
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.its possible.try以下代码

1
2
3
4
5
6
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中的异常处理确保连续性,例如开始救援确保


这真的很简单:

拿着这个:

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

如果您的Ruby是2.3或更高版本,请将其更改为此

1
2
  # the &. here is the 'safe navigation operator'
  driver.find_element(:class,"like")&.click

或者对于旧版本的ruby:

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

或者对于你正在做一些条件数据库逻辑的情况:

1
2
3
4
5
6
  element = driver.find_element(:class,"like")
  if element
    # do something in the database
  else
    # something else in the database
  end

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