在Capybara测试的拆解方法中无法执行localStorage.clear

时间:2014-06-17 14:52:41

标签: javascript ruby-on-rails local-storage capybara testunit

我正在使用Capybara来测试应用程序的前端部分,该应用程序利用HTML5本地存储来保存客户端上的数据值。为了确保来自一个测试的会话数据不会干扰另一个测试,我确保在每个测试的Capybara.reset_sessions!方法中调用teardown

我很快意识到这个方法does not actually clear local storage,并建议确保在每次测试后手动执行window.localStorage.clear(),所以我把这一行放在我的测试类的teardown方法中,如此:

  def teardown
    super
    page.execute_script("localStorage.clear()")
  end

然而,当我尝试运行它时:

  1) Error:
CartTest#test_adding_an_item_to_cart:
Selenium::WebDriver::Error::NoScriptResultError: <unknown>: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
  (Session info: chrome=34.0.1847.116)
  (Driver info: chromedriver=2.8.240825,platform=Linux 3.8.0-29-generic x86_64)

奇怪的是,我尝试将JavaScript调用移动到测试结束,如下所示:

  test "test with storage" do
    # Test some browser stuff
    page.execute_script("localStorage.clear()")
  end

工作正常。现在我当然可以在每次测试结束时将该行放到工作中,但这将是一团糟。任何人都知道如何让它在tearndown方法中运行?

2 个答案:

答案 0 :(得分:4)

想出来了。您必须致电visit,以便在调用execute_script之前,您的驱动程序位于当前会话的页面上。将我的拆解方法更改为下面的方法后,它起作用了:

  def teardown
    super
    visit "/" # This can be whatever URL you need it to be
    page.execute_script("localStorage.clear()")
  end

答案 1 :(得分:0)

我找到了在执行每个测试之前清除本地存储的方法。设置“ test / application_system_test_case.rb”时,添加以下选项:options: { clear_local_storage: true}

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400],
  options: { clear_local_storage: true}
end

也可以用于clear_session_storage