绝对不是,那是因为 Mechanize 和 Nokogiri 都没有运行 Javascript。
相反,您可以使用Selenium。
像这样的东西:
require 'selenium-webdriver'
class AlertChecker
Driver = Selenium::WebDriver.for :firefox
def initialize(url)
Driver.navigate.to url
end
def raise_alert(text)
Driver.execute_script "alert('#{text}')"
self
end
def safely_get_alert
begin
Driver.switch_to.alert
rescue Selenium::WebDriver::Error::NoAlertOpenError
end
end
end
用法:
alert_checker = AlertChecker.new("http://my.website")
alert = alert_checker.safely_get_alert
# => nil
alert_checker.raise_alert("hack")
alert = alert_checker.safely_get_alert
puts alert.text
# => 'hack'
# As far as I'm aware Selenium doesn't have a built-in way
# to tell you if it's an alert, confirm, or prompt.
# But you know it's a prompt, for example, you could also send
# keys before accepting or dismissing
alert.accept
alert = alert_checker.safely_get_alert
# => nil
不过,Selenium 处理警报有一些棘手的问题。
如果不使用 or 之类的东西,您的代码无法检测到类型(提示、确认或警报rescue
)try
。一切都通过switch_to.alert
.
此外,如果您的浏览器打开了警报,则除非您处理警报,否则您将无法运行任何后续命令。假设您navigate.to
在警报打开时尝试;你会得到一个错误,你没有处理警报,你的navigate.to
命令必须重新运行。引发此错误时,警报对象也将丢失。
以这种方式使用救援作为控制结构有点不吸引人,但我不知道有任何其他选择