4 votes

J'exécute capybara dans un contrôleur pour tester quelques éléments, mais je ne peux l'exécuter qu'une seule fois.

Oui, je sais que je ne devrais pas l'être, mais j'ai juste besoin d'exécuter un petit bout de Capybara script dans un contrôleur.

Le problème est qu'il ouvre un navigateur et tout, mais je veux fermer complètement le test ou l'exécuter en isolation.

Donc, par exemple, si j'exécute quelque chose comme :

Capybara.current_driver = :selenium
Capybara.app_host = 'https://www.google.com'
Capybara.visit("/")
Capybara.has_content?('foo')
Capybara.reset_sessions!

Le navigateur et la session restent ouverts.

Si je ferme le navigateur et que je relance le test, une exception "Connexion refusée - connect(2)" apparaît.

Je dois redémarrer l'ensemble de l'application Rails pour pouvoir exécuter à nouveau le test.

Existe-t-il un moyen d'exécuter et de réexécuter plusieurs tests Capybara sans avoir à redémarrer quoi que ce soit ?

Quelque chose d'hypothétique comme ça serait bien :

Capybara.new do
    #the tests...
end

ou ceci à la fin Capybara.shutdown

Je n'arrive pas à trouver quoi que ce soit dans la documentation.

4voto

Andrey Botalov Points 6566

Le pilote selenium de Capybara possède une fonction quit méthode . Quand Capybara démarre un navigateur, il enregistre at_exit qui invoquera quit.

Mais si vous voulez l'arrêter vous-même, vous devez faire deux choses :

  1. Appeler Capybara.page.driver.quit vous-même
  2. Monkeypatch Capybara pour que vous n'obteniez pas d'erreurs lorsque Capybara essaie de fermer le navigateur alors que vous l'avez déjà fermé :

    # from https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L9
    # code inside at_exit hook is removed
    class Capybara::Selenium::Driver
      def browser
        unless @browser
          @browser = Selenium::WebDriver.for(options[:browser], options.reject { |key,val| SPECIAL_OPTIONS.include?(key) })
        end
        @browser
      end
    end

Voici un code POC - https://gist.github.com/abotalov/6274926


Comme vous n'avez besoin que de "quelques commandes Capybara", vous pouvez également écrire une méthode d'aide si vous le souhaitez :

def with_capybara(&block)
  Capybara.app_host = 'http://www.stackoverflow.com'
  session = Capybara::Session.new(:selenium)
  block.call(session)
  session.driver.browser.quit
end

Voici également un code POC - https://gist.github.com/abotalov/6274999

-2voto

Richard_G Points 2939

Je ne peux pas dire que je comprends pourquoi vous essayez de faire ça... Cependant, voici deux ou trois choses à essayer.

De : https://github.com/jnicklas/capybara

Transactions et configuration de la base de données

S contre un serveur HTTP réel. Capybara s'en occupe et lance un serveur pour vous dans le même processus que votre test, mais sur un autre thread. Selenium est l'un de ces pilotes, alors que RackTest ne l'est pas.

Étant donné que, lors de l'utilisation de Selenium, Capybara doit lancer un serveur HTTP réel, vous devriez essayer un autre pilote comme RackTest. Capybara peut ne pas comprendre que vous avez besoin de l'arrêt du serveur HTTP.

Aussi, de cette même section :

Il est également possible de forcer votre ORM à utiliser l'option tous les threads. Ceci peut avoir des implications sur la sécurité des threads et peut causer des échecs étranges, il faut donc être prudent avec cette approche. Elle peut être peut être implémentée dans ActiveRecord grâce au patch suivant :

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

Vous pouvez essayer le correctif fourni pour voir si Capybara lance des fils qui ne sont pas fermés, aussi.

Dans un cas comme dans l'autre, je ne sais pas si ces options vous aideront, mais c'est quelque chose à essayer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X