С Capybara, как я могу перейти в новое окно для ссылок с целями "_blank"?

Возможно, это не проблема, с которой я столкнулся, но кажется, что когда я "click_link" ссылается на target = "_ blank", сеанс фокусируется на текущем окне.

Таким образом, я либо хочу иметь возможность переключаться в новое окно, либо игнорировать атрибут _blank - по существу, я просто хочу, чтобы он действительно перешел на страницу, указанную ссылкой, чтобы я мог убедиться, что это правая страница.

Я использую драйверы webkit и селена.


Я представил свои выводы до сих пор ниже. Более тщательный ответ очень ценится.

Кроме того, это работает только с селеном - эквивалент для драйвера webkit (или указание, где я мог бы его обнаружить сам) был бы очень благодарен.

Ответ 1

Capybara >= 2.3 включает новый API управления окнами. Его можно использовать как:

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

Ответ 2

Это решение работает только для драйвера Selenium

Все открытые окна - это магазины в Selenium's

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)

Ссылка на страницу проблем capybara: https://github.com/jnicklas/capybara/issues/173

Подробнее о возможностях переключения окна Selenium: http://qastuffs.blogspot.com/2010/10/testing-pop-up-windows-using-selenium.html

Ответ 3

Теперь это работает с помощью Poltergeist. Хотя window_handles все еще не реализован (вам нужно имя окна, то есть через всплывающее окно JavaScript):

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

Изменить: В комментарии ниже, Полтергейст теперь реализует window_handles с версия 1.4.0.

Ответ 4

Capybara предоставляет некоторые способы облегчения поиска и переключения окон:

facebook_window = window_opened_by do
  click_button 'Like'
end
within_window facebook_window do
  find('#login_email').set('[email protected]')
  find('#login_password').set('qwerty')
  click_button 'Submit'
end

Подробнее здесь: Документация Capybara

Ответ 5

Кажется, что невозможно с 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.

Ответ 7

По состоянию на май 2014 года на capybara-webkit работает следующий код

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

Ответ 8

Я знаю, что это старый пост, но для чего его стоит в 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

Ответ 9

Это работает для меня в capybara-webkit:

within_window(windows.last) do
  # code here
end

(Я использую capybara 2.4.1 и capybara-webkit 1.3.0)

Ответ 10

У меня возникла эта проблема при открытии ссылок в окне 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

Ответ 11

Вы можете передать имя, url или title окна. (Но теперь его погружение)

  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

желаем, чтобы он расширил использование метода для более четкого понимания

Ответ 12

Лучшая идея - обновить capybara до версии latests (2.4.1) и просто использовать windows.last потому что page.driver.browser.window_handles устарел.

Ответ 13

Чтобы явно изменить окно, вы используете 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 блок