Как с помощью Capybara перейти в новое окно для ссылок с целями "_blank"? - PullRequest
71 голосов
/ 30 сентября 2011

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

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

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


Ниже представлены мои выводы.Очень ценится более подробный ответ.

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

Ответы [ 14 ]

74 голосов
/ 02 августа 2014

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

new_window = window_opened_by { click_link 'Something' }
within_window new_window do
  # code
end
54 голосов
/ 03 октября 2011

Это решение работает только для драйвера 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)

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

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

9 голосов
/ 24 ноября 2015

Capybara предоставляет несколько методов, облегчающих поиск и переключение окон:

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

9 голосов
/ 05 марта 2013

Теперь работает с Полтергейстом.* * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * window_handles начиная с версия 1.4.0 .

8 голосов
/ 27 января 2015

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

Похоже, что сейчас это невозможно с capybara-webkit: https://github.com/thoughtbot/capybara-webkit/issues/271

: - (

В то же время https://github.com/thoughtbot/capybara-webkit/issues/129 заявляет, что возможно переключитьсяWindows с 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.

6 голосов
/ 08 мая 2014

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

 within_window(page.driver.browser.window_handles.last) do
   expect(current_url).to eq('http://www.example.com/')
 end
6 голосов
/ 13 января 2013

Теперь в пределах_окна реализовано для capybara-webkit http://github.com/thoughtbot/capybara-webkit/pull/314 и здесь вы можете увидеть, как его использовать http://github.com/mhoran/capybara-webkit-demo

4 голосов
/ 20 декабря 2016

Чтобы явно изменить окно, вы используете switch_to_window

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

Браузер после этого метода будет работать на новой странице, вместо того, чтобы переносить все в в пределах окна блок

4 голосов
/ 31 августа 2015

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

  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

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

...