使用 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