【问题标题】:Rspec + Capybara : How to click on alert boxRspec + Capybara:如何点击警报框
【发布时间】:2011-10-18 19:57:17
【问题描述】:

我已经浏览了 capybara + click on alert 的帖子,但似乎没有任何效果。以下是我的场景:

场景:当我点击更新按钮时,会出现一个警告框,其中包含“确定”和“取消”按钮。单击“确定”,然后出现新表单。

  1. 我正在编写请求规范,即使用 rspec 和 capybara。主要问题是单击警报框:以下是我的代码:

     context "update" do
       before(:all) do
         Capybara.current_driver = :selenium
       end
       after(:all) do
         Capybara.use_default_driver
       end
    
       it "update user to trainer" do
         click_button('Search')
         sleep 3 
         page.evaluate_script('data-confirm = function() { return true; }')
         page.click('OK')      
         click_button('Upgrade')
       end
     end
    

    但是执行脚本给了我以下错误:

    失败/错误:page.evaluate_script('data-confirm = function() { return true; }') Selenium::WebDriver::Error::UnexpectedJavascriptError: 无效赋值左侧 # ./spec/requests/ user_upgrades_spec.rb:30

  2. 对于第二个例子,即

    page.driver.browser.switch_to.alert.accept

    我的代码:

     context "update" do
       before(:all) do
         Capybara.current_driver = :selenium
       end
       after(:all) do
         Capybara.use_default_driver
       end
       it "update user to trainer" do
         click_button('Search')
         sleep 3   
         click_button('Upgrade') 
         page.driver.browser.switch_to.alert.accept
       end
     end 
    

我得到错误:

失败/错误:page.driver.browser.switch_to.alert.accept Selenium::WebDriver::Error::UnhandledError:

请告诉我如何进行下一步

【问题讨论】:

  • 您不能用破折号命名 JavaScript 变量。 data-confirm = function ... 是非法的。它看起来像(foo - bar) = function() { ... }。那是left-hand side # ...user_upgrades_spec.rb:30 错误。用 camelCase 命名您的 JavaScript 变量。

标签: rspec capybara


【解决方案1】:

我知道这是旧的,但现在这也适用于 poltergeist:

page.accept_alert

【讨论】:

    【解决方案2】:

    对于 WebKit:

    page.accept_confirm { click_button "Upgrade" }
    

    对于硒:

    page.driver.browser.switch_to.alert.accept
    

    【讨论】:

      【解决方案3】:
      page.accept_alert
      

      使用 Selenium 为我工作。其他驱动程序可能会有自己的语法。

      正如 Jillian Foley 所说,其他答案似乎已被弃用。

      【讨论】:

      • 正如@b-seven 提到的其他驱动程序,在撰写本文时,PhantomJS 的 Poltergeist 驱动程序还不支持 accept_alert
      • 太棒了!对我来说工作得很好! @B 七
      【解决方案4】:

      这里更新了答案,因为上面的选项似乎都已被弃用。

      Capybara::Session#accept_alert 似乎是现在完成此任务的最佳方法,其中将触发警报的操作应在一个块中传递。 http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Session:accept_alert

      例如:

      page.accept_alert 'Alert text here' do
          click_button('Search')
      end
      

      【讨论】:

      • 我得到了一个undefined method accept_alert' 用于#<:session>`,尽管根据文档,这是Capybara::Session 的一种方法。有什么想法吗?
      • 可能是水豚的旧版本,accept_alertCapybara 2.4.1 中引入。考虑运行bundle update capybara
      【解决方案5】:

      如果你想点击警告框的确定按钮,试试这一行:

      page.evaluate_script('window.confirm = function() { return true; }')
      

      别忘了用 javascript 标志标记你的测试

      it "update user to trainer", js: true do
          ...
      end
      

      并在您的 spec_helper 文件中使用 :webkit 或 :selenium 启用 Capybara.javascript_driver

      【讨论】:

      • 与 Capybara-Webkit 一起使用 :)
      • 在所有答案中,这是唯一对我有用的答案。
      【解决方案6】:

      你可以点击这样的警告框:

      page.driver.browser.switch_to.alert.accept
      

      【讨论】:

      • 非常感谢您的反馈。但是我已经使用了上面的代码但没有成功。
      • 也不适合我;另外,我相信这个问题明确地解决了这种方法(请参阅最后列出的错误消息)。因此,答案似乎暗示使用问题已经说明的内容在 Amit 目前的设置中不起作用。考虑到问题的背景,我不得不投反对票。对不起>.
      • 这不适用于 Capybara-webkit,就像 OP 一样
      • 为我工作的水豚 1.1.4。硒驱动程序
      • 对于 capybara-webkit:expect(page.driver.alert_messages.last).to eq text
      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 2012-07-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多