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

Peut-être que ce n’est pas vraiment le problème que je rencontre, mais il semble que lorsque je clique sur un lien avec target = “_ blank”, la session garde le focus sur la fenêtre actuelle.

Donc je veux soit pouvoir passer à la nouvelle fenêtre, ou ignorer l’atsortingbut _blank – essentiellement, je veux juste qu’il aille réellement à la page indiquée par le lien pour m’assurer que c’est la bonne page.

J’utilise les pilotes webkit et selenium.


J’ai soumis mes conclusions jusqu’ici ci-dessous. Une réponse plus approfondie est très appréciée.

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

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

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

Cette solution ne fonctionne que pour le pilote Selenium

Toutes les fenêtres ouvertes sont des magasins dans Selenium

 response.driver.browser.window_handles 

Ce qui semble être un tableau. Le dernier élément est toujours la dernière fenêtre ouverte, ce qui signifie que vous pouvez faire ce qui suit pour y accéder.

Dans un bloc:

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

Recentrez simplement pour 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 de capybara: https://github.com/jnicklas/capybara/issues/173

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

Cela fonctionne maintenant avec Poltergeist. Bien que window_handles soit toujours pas implémenté (vous avez besoin d’un nom de fenêtre, c’est-à-dire via un popup JavaScript):

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

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

Capybara propose quelques méthodes pour faciliter la recherche et le changement de fenêtres:

 facebook_window = window_opened_by do click_button 'Like' end within_window facebook_window do find('#login_email').set('a@example.com') find('#login_password').set('qwerty') click_button 'Submit' end 

Plus de détails ici: documentation Capybara

On dirait que ce n’est pas possible avec capybara-webkit en ce moment: https://github.com/thoughtbot/capybara-webkit/issues/271

🙁

Dans le même temps, https://github.com/thoughtbot/capybara-webkit/issues/129 affirme qu’il est possible de changer de fenêtre avec within_window .

https://github.com/thoughtbot/capybara-webkit/issues/47 suggère également que page.driver.browser.switch_to().window(page.driver.browser.window_handles.last) fonctionne. Ah bien, passons à la lecture de code.

Le code de https://github.com/thoughtbot/capybara-webkit/blob/master/lib/capybara/webkit/browser.rb a au moins quelques références suggérant que l’API qui fonctionne pour webdriver / firefox fonctionne également pour webkit.

Je sais que c’est un ancien message, mais pour ce qui est valable en capybara 2.4.4

 within_window(switch_to_window(windows.last)) do # in my case assert redirected url from a prior click action expect(current_url).to eq(redirect['url']) end 

Maintenant dedans_window implémenté 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

En mai 2014, le code suivant fonctionne sur capybara-webkit

  within_window(page.driver.browser.window_handles.last) do expect(current_url).to eq('http://www.example.com/') end 

Cela fonctionne pour moi dans capybara-webkit:

 within_window(windows.last) do # code here end 

(J’utilise capybara 2.4.1 et capybara-webkit 1.3.0)

J’ai eu ce problème en ouvrant des liens dans une fenêtre de gmail: je l’ai corrigé comme ceci:

 Given /^(?:|I )click the "([^"]*)" link in email message$/ do |field| # var alllinks = document.getElementsByTagName("a"); # for (alllinksi=0; alllinksi 

Vous pouvez aussi passer un nom , une url ou un titre de la fenêtre (mais maintenant c’est dipriqué)

  let(:product) { create :product } it 'tests' do visit products_path click_link(product.id) within_window(product_path(product)) do expect(page).to have_content(product.title) end end 

Vous pouvez aussi passer un labda ou un proc

 within_window(->{ page.title == 'Page title' }) do click_button 'Submit' end 

souhaite qu’il étend l’utilisation de la méthode pour mieux comprendre

Pour modifier explicitement la fenêtre, vous utilisez switch_to_window

  def terms_of_use terms_window = window_opened_by do click_link(@terms_link) end switch_to_window(terms_window) end 

Un navigateur suivant cette méthode fonctionnera dans la nouvelle page, au lieu de tout envelopper dans un bloc within_window

La meilleure idée est de mettre capybara à jour vers la version la plus récente (2.4.1) et d’utiliser simplement windows.last car page.driver.browser.window_handles est obsolète.