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