Как получить названия окон, идентификаторы и имена в selenium-webdriver?
Im пытается реализовать следующие методы из селен-webdriver (Рубин)
- get_all_window_ids
- get_all_window_titles
- get_all_window_names
- я запустил Selenium IDE и экспортировал свой скрипт в Ruby Test::Unit. Спас как .rb
- открыл мой скрипт для редактирования с помощью Aptana Studio 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
в конечном счете моя цель здесь-запустить мой скрипт автоматизации:
- нажмите на ссылку, которая открывает новое окно с target=_blank и без windowID (не реализует В JS)
- определите имена всех открытых окон в браузере
- переключитесь на новое всплывающее окно с помощью метода switchToWindow(name)
- продолжить выполнение моего сценария в этом всплывающем окне
я гуглил и исследовал это в интернете, и я не получил много информации.
спасибо и, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
- 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/
вы можете увидеть полный совет здесь.