79 votes

Avec Capybara, comment passer à la nouvelle fenêtre pour les liens avec des cibles "_blank" ?

Ce n'est peut-être pas le problème que je rencontre, mais il semble que lorsque je "click_link" un lien avec target="_blank", la session garde le focus sur la fenêtre actuelle.

Je veux donc soit pouvoir passer à la nouvelle fenêtre, soit ignorer l'attribut _blank - en gros, je veux juste qu'il aille effectivement à la page indiquée par le lien pour que je puisse m'assurer que c'est la bonne page.

J'utilise les pilotes webkit et selenium.


J'ai présenté ci-dessous mes conclusions jusqu'à présent. Une réponse plus approfondie serait très appréciée.

De plus, cela ne fonctionne qu'avec selenium - l'équivalent pour le pilote webkit (ou indiquer où je pourrais le découvrir moi-même) serait très apprécié.

89voto

Andrey Botalov Points 6566

Capybara >= 2.3 inclut la nouvelle API de gestion des fenêtres. Elle peut être utilisée comme :

new_window = window_opened_by { click_link 'Something' }
within_window new_window do
  # code
end

3 votes

Poltergeist 1.6 implémente cette API, donc à ce jour, c'est la façon d'utiliser poltergeist.

54voto

GlyphGryph Points 1501

Cette solution ne fonctionne que pour le pilote Selenium.

Toutes les fenêtres ouvertes sont stockées dans le répertoire de Selenium.

response.driver.browser.window_handles

Ce qui semble être un tableau. Le dernier élément est toujours la fenêtre qui a été ouverte le plus récemment, ce qui signifie que vous pouvez faire ce qui suit pour passer à cette fenêtre.

A moins d'un pâté de maison :

new_window=page.driver.browser.window_handles.last 
page.within_window new_window do
  #code
end

Il suffit de se recentrer sur la session en cours :

session.driver.browser.switch_to.window(page.driver.browser.window_handles.last)

Référencé sur la page des problèmes des capybara : https://github.com/jnicklas/capybara/issues/173

Plus de détails sur les capacités de changement de fenêtre de Selenium : http://qastuffs.blogspot.com/2010/10/testing-pop-up-Windows-using-selenium.html

4 votes

C'est très bien, mais le deuxième exemple est un peu trompeur. Il n'y a pas de différence entre session y page donc session.driver.browser y page.driver.browser font en fait référence à la même chose. Cela m'a perturbé lorsque j'ai essayé d'adapter cela à un contexte différent, en accédant à Capybara par le biais d'une bibliothèque différente, et sans utiliser le DSL. J'ai dû lire le code du DSL de Capybara pour comprendre que pour accéder à 'page', j'ai juste besoin d'accéder à la session.

0 votes

J'adore quand les solutions fonctionnent simplement avec un copier-coller, sans tous les déchets supplémentaires.

3 votes

Ce n'est pas seulement pour le sélénium : within_window(page.driver.window_handles.last) fonctionne pour moi avec capybara-webkit .

11voto

C'est maintenant travail avec Poltergeist. Bien que window_handles n'est toujours pas implémenté (vous avez besoin d'un nom de fenêtre, c'est-à-dire via une popup JavaScript) :

within_window 'other_window' do
  current_url.should match /example.com/
end

Edit : Selon le commentaire ci-dessous, Poltergeist implémente maintenant window_handles depuis version 1.4.0 .

3 votes

Je viens d'essayer page.within_window page.driver.browser.window_handles.last do ... et ça semble fonctionner comme prévu dans Poltergeist. Il n'est pas nécessaire de donner un nom à la fenêtre. Cette réponse doit donc être mise à jour.

1 votes

Capybara 2.3 n'utilise plus l'appel à la fonction within_window avec une chaîne de caractères : DEPRECATION WARNING: Passing string argument to #within_window is deprecated. Pass window object or lambda. La méthode documentée par Andrey Botalov corrige cette dépréciation.

7voto

user132837 Points 416

Me semble qu'il n'est pas possible avec le capybara-webkit dès maintenant: https://github.com/thoughtbot/capybara-webkit/issues/271

:-(

Dans le même temps https://github.com/thoughtbot/capybara-webkit/issues/129 prétend qu'il est possible de passer de windows avec within_window.

Aussi https://github.com/thoughtbot/capybara-webkit/issues/47 suggère que l' page.driver.browser.switch_to().window(page.driver.browser.window_handles.last) travaux. Ah bien, à la lecture du code.

Le code à https://github.com/thoughtbot/capybara-webkit/blob/master/lib/capybara/webkit/browser.rb au moins a quelques références qui suggèrent que l'API travaille pour webdriver / firefox travaille aussi pour webkit.

1 votes

Voir mon commentaire sur la réponse acceptée : within_window(page.driver.window_handles.last) fonctionne pour moi avec capybara-webkit.

6voto

E-Hauler Points 58

Implémentation de within_window pour capybara-webkit http://github.com/thoughtbot/capybara-webkit/pull/314 et ici vous pouvez voir comment l'utiliser http://github.com/mhoran/capybara-webkit-demo

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