С Capybara, как мне переключиться на новое окно для ссылок с "пустыми" целями?
возможно, это на самом деле не проблема, которую я испытываю, но кажется, что когда я "click_link" ссылка с target="_blank", сеанс сохраняет фокус на текущем окне.
поэтому я либо хочу переключиться на новое окно, либо игнорировать атрибут _blank - по сути, я просто хочу, чтобы он действительно перешел на страницу, указанную ссылкой, чтобы я мог убедиться, что это правильная страница.
Я использую драйверы webkit и selenium.
I представил мои выводы до сих пор ниже. Более подробный ответ очень ценится.
кроме того, это работает только с selenium - эквивалент для драйвера webkit (или указывая, где я мог бы обнаружить его сам) будет очень признателен.
13 ответов:
Capybara >= 2.3 включает в себя новый API управления окнами. Он может быть использован как:
new_window = window_opened_by { click_link 'Something' } within_window new_window do # code end
Это решение работает только для драйвера Selenium
все открытые окна-это магазины в селене
response.driver.browser.window_handles
который, кажется, массив. Последний элемент всегда является последним открытым окном, то есть вы можете сделать следующее, Чтобы переключиться на него.
в блоке:
new_window=page.driver.browser.window_handles.last page.within_window new_window do #code end
просто перефокусировать для текущей сессии:
session.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
ссылка на странице проблемы капибары: https://github.com/jnicklas/capybara/issues/173
больше деталей на возможностях переключения окна Селена: http://qastuffs.blogspot.com/2010/10/testing-pop-up-windows-using-selenium.html
вот это работающего с полтергейстом. Хотя
window_handles
все еще не реализовано (вам нужно имя окна, т. е. через всплывающее окно JavaScript):within_window 'other_window' do current_url.should match /example.com/ end
Edit: за комментарий ниже, полтергейст теперь реализует
window_handles
С версия 1.4.0.
капибара предоставляет несколько методов, чтобы облегчить поиск и переключение между окнами:
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
подробности здесь: капибара документации
Кажется, что это невозможно с capybara-webkit прямо сейчас:https://github.com/thoughtbot/capybara-webkit/issues/271
: - (
в то же время https://github.com/thoughtbot/capybara-webkit/issues/129 утверждает, что можно переключать окна с
within_window
.также https://github.com/thoughtbot/capybara-webkit/issues/47 предполагает, что
page.driver.browser.switch_to().window(page.driver.browser.window_handles.last)
строительство. Ну что ж, перейдем к коду чтение.код на https://github.com/thoughtbot/capybara-webkit/blob/master/lib/capybara/webkit/browser.rb по крайней мере, есть некоторые ссылки, которые предполагают, что API, который работает для webdriver / firefox, также работает для webkit.
Я знаю, что это старый пост, но для чего его стоит в 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
теперь within_window реализован для capybara-webkit http://github.com/thoughtbot/capybara-webkit/pull/314 и здесь вы можете увидеть, как его использовать http://github.com/mhoran/capybara-webkit-demo
по состоянию на май 2014 года следующий код работает на capybara-webkit
within_window(page.driver.browser.window_handles.last) do expect(current_url).to eq('http://www.example.com/') end
это работает для меня в capybara-webkit:
within_window(windows.last) do # code here end
(Я использую capybara 2.4.1 и capybara-webkit 1.3.0)
У меня была эта проблема при открытии ссылок в окне gmail: я исправил это так:
Given /^(?:|I )click the "([^"]*)" link in email message$/ do |field| # var alllinks = document.getElementsByTagName("a"); # for (alllinksi=0; alllinksi<alllinks.length; alllinksi++) { # alllinks[alllinksi].removeAttribute("target"); # } page.execute_script('var alllinks = document.getElementsByTagName("a"); for (alllinksi=0; alllinksi<alllinks.length; alllinksi++) { alllinks[alllinksi].removeAttribute("target"); }') within(:css, "div.msg") do click_link link_text end end
Вы можете пройти имя,url или title окна (Но теперь его dipricated)
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
Вы можете пройти labda или proc и
within_window(->{ page.title == 'Page title' }) do click_button 'Submit' end
желаю, чтобы он растягивал использование метода до более четкого понимания
чтобы явно изменить окно, вы используете switch_to_window
def terms_of_use terms_window = window_opened_by do click_link(@terms_link) end switch_to_window(terms_window) end
после этого метод браузера будет работать на новой странице, а не обернуть все в within_window блок