【问题标题】:Modal dialog present (Selenium::WebDriver::Error::UnhandledAlertError) after dismissing confirm popup关闭确认弹出窗口后出现模态对话框(Selenium::WebDriver::Error::UnhandledAlertError)
【发布时间】:2012-02-19 02:13:15
【问题描述】:

我有一个页面是这样的:

<input type="button" onclick="confirm('confirm popup');" value="click" />

当我进入页面并点击链接时:

require "watir-webdriver"
browser = Watir::Browser.new
browser.goto "page.html"
browser.button.click

确认弹出窗口出现。我可以用这个来解雇它:

require "watir-webdriver/extensions/alerts"
browser.confirm(true) {browser.button(:value => 'Confirm').click}

但我收到此错误消息:

[remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/command_processor.js:10302:in `unknown': Modal dialog present (Selenium::WebDriver::Error::UnhandledAlertError)
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/driver-component.js -> file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/dispatcher.js:85:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/driver-component.js -> file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/dispatcher.js:516:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/driver-component.js -> file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/dispatcher.js:351:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/driver-component.js -> file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/webdriverserver.js:47:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/httpd.js:1935:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/httpd.js:2261:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/httpd.js:1168:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/httpd.js:1616:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/httpd.js:1464:in `unknown'
    from [remote server] file:///var/folders/yx/bz_81fc143b4r9pyhks300m00000gn/T/webdriver-profile20120218-1562-7b7q8d/extensions/fxdriver@googlecode.com/components/httpd.js:1333:in `unknown'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/http/default.rb:64:in `request'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/bridge.rb:590:in `raw_execute'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/bridge.rb:568:in `execute'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/remote/bridge.rb:314:in `executeScript'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.19.0/lib/selenium/webdriver/common/driver.rb:209:in `execute_script'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/watir-webdriver-0.5.3/lib/watir-webdriver/browser.rb:129:in `execute_script'
    from /Users/zeljko/.rvm/gems/ruby-1.9.3-p125/gems/watir-webdriver-0.5.3/lib/watir-webdriver/extensions/alerts.rb:39:in `confirm'
    from popup.rb:7:in `<main>'

我做错了什么?

环境:

  • Mac OS X 10.7.3
  • 火狐10.0.2
  • Ruby 1.9.3p125
  • selenium-webdriver 2.19.0
  • watir-webdriver 0.5.3

【问题讨论】:

    标签: javascript popup watir watir-webdriver confirm


    【解决方案1】:

    我将向您推荐此答案https://stackoverflow.com/a/8172888/409820,我在其中解释了使用诸如 browser.confirm 之类的方法。其中的示例有点令人困惑,因为它们直接来自测试,并且如果您不了解测试页面上有多个按钮的上下文,并且导致确认对话框的按钮的值为“确认”那么被方法包裹的'inner'命令就没有多大意义了。

    confirm 方法后面的循环(或块)中的命令是导致弹出窗口发生的命令。

    因此,如何使用这些方法的更好示例应该类似于

    alert_message_text = browser.confirm(true) do
      #watir code that causes confirm popup goes here
    end 
    

    alert_message_text = browser.confirm(true) {#code that causes confirm popup}
    

    换句话说,使用.confirm(response) {block} 的工作方式很像告诉 watir “好的,我在块中给你的命令将导致出现确认对话框,当它出现时,我希望你采取行动由response指定”

    所以你出错的地方是块内的命令,你需要移动块内的“browser.button.click”或类似的东西。你的代码最终会看起来像这样

    require "watir-webdriver"
    require "watir-webdriver/extensions/alerts"
    
    browser = Watir::Browser.new
    browser.goto "page.html"
    browser.confirm(true) {browser.button(:value => 'click').click}
    

    我将您的点击操作更改为更具体一点,根据您提供的 HTML 中的 value 属性识别按钮。如果您确定它始终是页面上的第一个按钮,您可以将最后一行更改为

    browser.confirm(true) {browser.button.click}
    

    【讨论】:

    • 谢谢查克。奥斯汀有啤酒等着你。 :) 有趣的是,当我使用browser.confirm(true) {browser.button.click} 时,我没有看到弹出窗口。我猜它会覆盖window.confirm JavaScript 函数,类似于browser.execute_script("window.confirm = function() {return true}")
    • 可能是,但是您的代码正在执行应该让它出现的点击,所以不确定那里是什么。我带你去喝啤酒。如果您有时间将上述信息和其他链接答案中的信息放入 watir wiki 或我们的用户更容易找到的地方,我们会为您购买一个作为回报。
    • 计划是把它都写在书里,但我只是到现在还没有时间。应该在集市之前的书中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2015-08-08
    相关资源
    最近更新 更多