非也,那是因爲沒有機械化或引入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
沒有與硒的處理警報的一些技巧性的東西,雖然。
沒有使用像rescue
或try
這樣的東西,您的代碼無法檢測類型(提示,確認或提醒)。一切都通過switch_to.alert
達成。另外,如果您的瀏覽器打開了警報,則除非您處理警報,否則無法運行任何後續命令。假設您在嘗試打開警報時嘗試navigate.to
;你會得到一個錯誤你沒有處理警報和你的navigate.to
命令將不得不重新運行。發生此錯誤時,警報對象也會丟失。
這是一個有點吸引力使用救援以這種方式控制結構,但我不知道有任何其他選項
那麼這是什麼,有沒有辦法通過html找到它?就像會有一個腳本標籤來解析? – papasmurf
可能確保知道XSS的最簡單方法是運行Javascript(不能與Nokogiri/Mechanize一起使用)。 –
是的,我不認爲這會很容易 – papasmurf