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

Posted

技术标签:

【中文标题】使用 Nokogiri 和 Selenium,如果驱动程序无法执行命令,是不是可以跳过它?【英文标题】:Using Nokogiri and Selenium, is it possible to skip a command if the driver is unable to perform it?使用 Nokogiri 和 Selenium,如果驱动程序无法执行命令,是否可以跳过它? 【发布时间】:2016-11-05 15:43:46 【问题描述】:

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

这是我目前所拥有的:

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

这可能吗?

【问题讨论】:

【参考方案1】:

遵循@maxplener 的建议,您可以挽救关于找不到元素的异常,然后使用该信息执行某些操作。在这种情况下,您要查找的例外是 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

【讨论】:

【参考方案2】:

是的,有可能。试试下面的代码

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

你还可以通过像begin rescue ensure这样的ruby异常处理来确保连续性

【讨论】:

【参考方案3】:

这里真的很简单:

拿着这个:

  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 / 命令。检查数组是否为空,检查键是否存在等。如果您预见到会引发错误,请挽救该特定错误。

【讨论】:

我的浏览器在到达element = driver.find_element(:class, "like") 行时已经抛出“无法定位元素”错误。 在这种情况下我该怎么做?

以上是关于使用 Nokogiri 和 Selenium,如果驱动程序无法执行命令,是不是可以跳过它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS Sierra 10.12 上安装 Nokogiri

如何使用 Nokogiri 解析 HTML 表格?

如何使用 Nokogiri 访问属性

在 OSX 10.10 Yosemite 上安装 Nokogiri

使用 Ruby / Nokogiri 解析随机类名

使用 nokogiri 去除样式属性