【问题标题】:Can you close all open windows in capybara?你能关闭水豚所有打开的窗户吗?
【发布时间】:2012-06-01 07:50:47
【问题描述】:

因此,当我单独运行测试时,它们运行良好。但是,当我运行我的功能(多次测试)时,我的代码失败了。
这是因为当 capybara 存在时,并不是我所有的窗口都在关闭,因此我的 selenium 驱动程序不知道要使用哪个窗口。

基本上,发生的事情是我的测试打开了多个窗口。发生这种情况是因为我的测试是单击打开新窗口的链接并检查新窗口中的内容。尽管我在每次测试结束时都说page.quit,但此功能并未关闭所有打开的窗口(关闭活动窗口但不关闭原始窗口)。当第二次测试运行时,它使用了最初创建的窗口,但是当它打开新的弹出窗口时,它使用了错误的窗口。

如何确保在每次测试期间都使用新浏览器并关闭上一次测试的所有窗口。
我目前正在使用page.reset!page.quit
不确定,但我可以说session.quit 关闭所有打开的浏览器窗口吗?

【问题讨论】:

    标签: ruby selenium capybara


    【解决方案1】:

    此代码有效:

    page.execute_script "window.close();"
    

    我只是在要关闭的窗口中执行此操作。

    【讨论】:

    • 如果您使用诸如脏表单之类的插件,并且屏幕上有脏表单,则此代码不起作用,在这种情况下,javascript 会弹出“您确定”警报和页面没有关闭。更好地执行“page.reset!”在运行测试之前。
    • page.execute_script "window.close();" 对我不起作用。应该没有;,即page.execute_script "window.close()"
    【解决方案2】:

    我使用这段代码来访问弹出窗口并在之后关闭它们。应该差别不大

    within_window(page.driver.browser.window_handles.last) do
      click buttons and stuff...
      ...
      page.driver.browser.close #closes popup
    end
    

    希望对你有帮助

    【讨论】:

    • 这不起作用,因为所有资源都丢失了,第二次测试失败,说“找不到浏览器”或类似的东西。
    【解决方案3】:
    page.driver.browser.window_handles.each do |handle|
      page.driver.browser.switch_to.window(handle)
      page.execute_script "window.close()"
    
    end
    

    为我施了魔法。 @Jason 和 @Justin 的答案的组合。

    谢谢!

    【讨论】:

      【解决方案4】:

      尝试以下方法:

      page.driver.browser.window_handles.each do |handle|
        page.driver.browser.switch_to.window(handle)
        page.quit
      end
      

      (我认为它会起作用,但我没有机会测试它。)

      【讨论】:

      • 这行不通,'quit' 功能不存在。与关闭相同。
      • 这虽然是随机的。这次它给了我Failure/Error: Unable to find matching line from backtrace Selenium::WebDriver::Error::NoSuchWindowError: getUrl execution failed; The window could not be found
      • 未定义退出函数
      【解决方案5】:

      试试这个:

      tab_id = page.driver.find_window("http://google.com.au")
      page.driver.browser.switch_to.window(tab_id)
      page.driver.quit
      

      这对我有用。

      【讨论】:

        【解决方案6】:

        为了在规范文件中包含所有断言,我在执行断言后将控制权传递给新页面(窗口)页面并将控制权传递到原始页面,如下所示:

        after(:each) do
          expect(@static_page.has_logo?).to eq(true) # assertion in new page
          page.execute_script('window.close()') # close new page
          switch_to_window(windows.first) # return control to first page
        end
        

        【讨论】:

          【解决方案7】:

          在此处添加此页面是因为此页面出现在“capybara close all windows”的前几个 Google 搜索结果中。

          我们发现了一些神秘的功能规范失败,我们追踪到了一些在第二个选项卡中打开应用程序链接的问题——因为这些选项卡刚刚打开,它们经常会触发一个失败的 AJAX 请求,而当前的测试会以完全不相关的错误轰炸。我们修复的方法是添加一个钩子,确保在每个功能规范之后关闭除当前窗口之外的所有窗口:

          Rspec.configure do |config|
            config.after(type: :feature) do
              # Make sure all browser windows except one are closed
              windows.reject(&:current?).each(&:close)
            end
          end
          

          这对我们来说就像一个魅力,使用 Capybara 的 headless_chrome 驱动程序。

          【讨论】:

            【解决方案8】:

            将此添加到您的功能测试中,它将重置会话 cookie 并在空白页面上开始测试:

            # Window washing - use a clean window before every example
            before(:example) do
              page.reset!
            end
            

            【讨论】:

              猜你喜欢
              • 2011-11-27
              • 2011-03-25
              • 1970-01-01
              • 2019-06-21
              • 2012-07-06
              • 2020-08-14
              • 2013-08-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多