Не удается выполнить localStorage.clear в методе демонтажа теста Capybara

#javascript #ruby-on-rails #local-storage #capybara #testunit

#javascript #ruby-on-rails #локальное хранилище #capybara #testunit

Вопрос:

Я использую Capybara для тестирования интерфейсной части приложения, которое использует локальное хранилище HTML5 для сохранения значений данных на клиенте. Чтобы гарантировать, что данные сеанса из одного теста не мешают другому, я обязательно вызывал Capybara.reset_sessions! teardown метод каждого теста.

Вскоре я понял, что этот метод фактически не очищает локальное хранилище, и мне посоветовали убедиться 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 методе?

Ответ №1:

Понял это. Перед вызовом вы должны вызвать, visit чтобы ваш драйвер находился на странице в текущем сеансе execute_script . После изменения моего метода демонтажа на приведенный ниже, он сработал:

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

Ответ №2:

Я нашел способ очистить локальное хранилище ПЕРЕД выполнением каждого теста. При настройке «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