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 |
理想情况下,取代
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 /命令。 检查数组是否为空,检查密钥是否存在等。如果您预见到出现错误,请抢救该特定错误。