Как получить названия окон, идентификаторы и имена в selenium-webdriver?

Im пытается реализовать следующие методы из селен-webdriver (Рубин)

  • get_all_window_ids
  • get_all_window_titles
  • get_all_window_names
  1. я запустил Selenium IDE и экспортировал свой скрипт в Ruby Test::Unit. Спас как .rb
  2. открыл мой скрипт для редактирования с помощью Aptana Studio 3
  3. исходный код следующим образом:
require "rubygems"
require "selenium-webdriver"
require "test/unit"

class SwitchToPopup3 < Test::Unit::TestCase

  def setup
    @driver = Selenium::WebDriver.for :firefox
    @base_url = (URL of my test website)
    @driver.manage.timeouts.implicit_wait = 30
    @verification_errors = []
  end

  def teardown
    @driver.quit
    assert_equal [], @verification_errors
  end


def test_switch_to_popup3
  .
  .
  puts @driver.get_all_window_ids()
  puts @driver.get_all_window_titles()
  puts @driver.get_all_window_names()
  .
  .
end

в ошибки я получаю это

NoMethodError: undefined method `get_all_window_ids' for #    <Selenium::WebDriver::Driver:0x101e4b040 browser=:chrome>
/Users/rsucgang/Documents/Aptana Studio 3 Workspace/Testing/SwitchToPopup2.rb:37:in `test_switch_to_popup3'

Я изучил документацию для Привязок ruby для selenium-webdriver

http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/Client/GeneratedDriver.html#get_all_window_titles-instance_method

в конечном счете моя цель здесь-запустить мой скрипт автоматизации:

  1. нажмите на ссылку, которая открывает новое окно с target=_blank и без windowID (не реализует В JS)
  2. определите имена всех открытых окон в браузере
  3. переключитесь на новое всплывающее окно с помощью метода switchToWindow(name)
  4. продолжить выполнение моего сценария в этом всплывающем окне

я гуглил и исследовал это в интернете, и я не получил много информации.

спасибо и, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

  • OSL Mac OSX 10.7.3
  • Рубин: Рубин 1.8.7 (2010-01-10 patchlevel 249) [универсальный-дарвин11.0]
  • Браузер: Firefox 9.0.1 (Mac)
  • Chrome: Chrome 17.0.963.79 (Mac)
  • селен-сервер: Ruby gem 2.20.0

2 ответов


проблема в том, что get_all_window_ids для Selenium:: Client, а не Selenium::Webdriver. Я считаю, что Selenium:: Client-это старая версия Selenium, а API-это не то же самое, что Selenium:: Webdriver (см. здесь). Поскольку вы используете Selenium:: Webdriver, это объясняет, почему вы получаете ошибку "неопределенный метод".

для Selenium:: Webdriver, единственный способ, которым я знаю, как переключаться между окнами, использует:

@driver.switch_to.window("<window_handle>")

вы можете получить все известные window_handles by:

@driver.window_handles
#=> Returns all window handles as an array of strings

если вы хотите переключиться на всплывающее окно, вы только что открыли, вы можете сделать следующее. Обратите внимание, что это предполагает .window_handles находятся в том порядке, в котором были открыты окна, что я считаю правдой:

@driver.switch_to.window @driver.window_handles.last

подводя итог, предполагая, что вы заботитесь только о доступе к всплывающему окну (а не о доступе по имени) , вы можете сделать:

#Click control that opens popup
@driver.find_element(:id, 'button that opens popup').click
#Switch to popup
@driver.switch_to.window @driver.window_handles.last
#Do actions in new popup
@driver.find_element(:id, 'id of element in popup').click

обратите внимание, что если после работы с всплывающим окном вы захотите вернуться в исходное окно, то я предлагаю вы делаете следующее. Пройдя блок до switch_to.window, блок будет выполнен во всплывающем окне и когда блок заканчивается @driver будет автоматически указывать на исходное окно.

#Click control that opens popup
@driver.find_element(:id, 'button that opens popup').click
#Switch to popup
@driver.switch_to.window( @driver.window_handles.last ){
  #Do actions in new popup
  @driver.find_element(:id, 'id of element in popup').click
}
#Continue with original window
@driver.find_element(:id, 'button in original window').click

Джастин, у тебя хороший подход. Но есть gotcha в предположении, что дескрипторы окна вернутся в правильном порядке. Это не всегда так во всех браузерах. Я описываю немного другой подход в моем бесплатном еженедельном бюллетене Selenium tip (elemental-selenium.com).

это выглядит так:

@driver.get 'http://the-internet.herokuapp.com/windows'
main_window = @driver.window_handle
@driver.find_element(css: '.example a').click
windows = @driver.window_handles
  windows.each do |window|
    if main_window != window
      @new_window = window
    end
  end
@driver.switch_to.window(main_window)  
@driver.title.should_not =~ /New Window/  
@driver.switch_to.window(@new_window)  
@driver.title.should =~ /New Window/  

вы можете увидеть полный совет здесь.