你如何在selenium-webdriver中获得窗口标题,ID和名称?

我试图从selenium-webdriver (ruby)实现以下方法

  • 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 #  /Users/rsucgang/Documents/Aptana Studio 3 Workspace/Testing/SwitchToPopup2.rb:37:in `test_switch_to_popup3' 

我研究了selenium-webdriver的ruby绑定文档

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
  • Ruby:ruby 1.8.7(2010-01-10 patchlevel 249)[universal-darwin11.0]
  • 浏览器:Firefox 9.0.1(Mac)
  • Chrome:Chrome 17.0.963.79(Mac)
  • Selenium-Server:Ruby gem 2.20.0

问题是get_all_window_ids用于Selenium :: Client而不是Selenium :: Webdriver。 我相信Selenium :: Client是旧版本的Selenium,API与Selenium :: Webdriver不同(见这里 )。 由于您使用的是Selenium :: Webdriver,这解释了为什么会出现“未定义方法”错误。

对于Selenium :: Webdriver,我知道如何在Windows之间切换的唯一方法是使用:

 @driver.switch_to.window("") 

您可以通过以下方式获取所有已知的window_handles:

 @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 

贾斯汀,你有一个很好的方法。 但是假设窗口句柄将以正确的顺序返回有一个问题。 并非所有浏览器都是这种情况。 我在我的免费每周Selenium提示通讯(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/ 

你可以在这里看到完整的提示。