【问题标题】:Unable to control Javascript popup in Firefox browser in Ruby Watir无法在 Ruby Watir 的 Firefox 浏览器中控制 Javascript 弹出窗口
【发布时间】:2016-12-11 15:24:01
【问题描述】:

在页面中,当我单击某个按钮时,我会看到一个带有“确定”和“取消”按钮的 javascript 弹出窗口。我想使用 Ruby Watir 脚本在该弹出窗口中单击“确定”按钮。所以我使用下面的代码。我收到 FAIL 消息,因为 Firefox 浏览器中的 javascript 弹出窗口在几分之一秒内出现和消失。因此,为了检查脚本是否捕捉到警报,我确实打印了p browser.alert.present?,但我认为这是错误的。如何处理这样的问题?

if (certain_button_click)
    p browser.alert.present? #I get this as 'false'

    browser.wait_until(30) {
        browser.alert.present?
    } rescue nil 

    p browser.alert.present? #I get this as 'false'      

    if browser.alert.present?
        browser.alert.ok
        message = 'Click Ok - PASS'
    else
        message = 'Click Ok - FAIL'
    end
end

请帮忙。提前致谢。

谢谢, 阿什温

【问题讨论】:

    标签: javascript ruby watir


    【解决方案1】:

    老实说,我不知道您要在这里完成什么,但我知道您的代码在做什么。

    每当出现警报时,Selenium 都会引发UnhandledAlertError,但对驱动程序采取了与警报无关的操作。您的代码正在做的是挽救该异常(好吧,所有异常,当您知道要避免哪个异常时,您应该避免这样做)。 Firefox 在这方面比 Chrome 拥有different behavior,因为它在引发异常时也会关闭警报。所以你的代码正在做你告诉它做的事情。

    如果您使用 Watir 6.0,则无需再指定等待时间。如果您只想在警报出现时将其关闭,此代码将自动等待警报出现并在出现时单击“确定”。如果警报从未出现,则会出现超时错误。

    element_causing_alert.click
    browser.alert.ok
    

    如果您尝试测试警报是否显示,那么您可以使用以下代码:

    begin
      browser.alert.ok
      true
    rescue Watir::Wait::TimeoutError
      false
    end
    

    或者如果你想指定超时前的等待时间:

    begin
      browser.alert.wait_until(timeout: 5, &:present?).ok
      true
    rescue Watir::Wait::TimeoutError
      false
    end
    

    【讨论】:

      【解决方案2】:

      这是另一种想法。您可以在浏览器中使用execute_script 来“排除”警报调用以设置全局变量。然后另一个execute_script 检查变量是否已设置。

      例子:

      def stub_alert
        script = <<-JS
          window.alert = function(){ window.alerted = true }
        JS
        browser.execute_script stub_alert
      end
      
      def check_for_alert
        script = <<-JS
          return window.alerted == true
        JS
        browser.execute_script stub_alert
      end
      

      Watir 在后台使用 selenium,并且在处理警报方面存在一些棘手的问题。如果我在处理警报之前运行任何 javascript,我遇到过 Selenium 对警报的引用消失的情况。

      【讨论】:

      • 我描述了您在我的回答中目睹的行为的原因。您试图对无法通过 Selenium API 完成的警报呈现做什么?一般来说,我建议不要使用 javascript 变通方法,除非它是绝对的最后手段。
      • 如果真的需要他们的测试用例与警报交互,例如输入文本,那么当然 selenium api 是要走的路。但只是说“是否发出警报?”更简单,无需了解警报处理的细节。
      • 在 Watir 中有 browser.alert.present? 为您提供该功能。我们只需要同意不同意您的 javascript 代码的简单性。 ;-)
      • @titusfortner Selenium 的警报处理系统在我看来仍有改进的余地。例如,您如何无法区分警报/确认/提示。此外,UnhandledAlertError 如何关闭警报,这可能是无意的。如果不是因为这些东西,我不会那么热衷于推荐将其剔除
      • Selenium 4 和 W3C 应该使它在浏览器之间更加标准化 (w3c.github.io/webdriver/webdriver-spec.html#user-prompts)。请注意,geckodriver 现在有一个错误,它永远不会抛出该错误。此外,Firefox 和 IE 都允许通过设置功能 (UNEXPECTED_ALERT_BEHAVIOUR) 自动解除警报,这也将在 W3C 中得到支持。如果您认为能够区分不同类型的警报很重要,您应该向 W3C 提出问题 - github.com/w3c/webdriver
      猜你喜欢
      • 2015-02-09
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多