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

Ray*_*ndS 6 ruby selenium webdriver

我试图从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
Run Code Online (Sandbox Code Playgroud)

我一直得到的错误是

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'
Run Code Online (Sandbox Code Playgroud)

我研究了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

小智 9

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

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


Jus*_* Ko 7

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

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

@driver.switch_to.window("<window_handle>")
Run Code Online (Sandbox Code Playgroud)

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

@driver.window_handles
#=> Returns all window handles as an array of strings
Run Code Online (Sandbox Code Playgroud)

如果要切换到刚刚打开的弹出窗口,可以执行以下操作.请注意,这假设.window_handles是按窗口打开的顺序,我认为是真的:

@driver.switch_to.window @driver.window_handles.last
Run Code Online (Sandbox Code Playgroud)

总而言之,假设您只关心访问弹出窗口(而不是关于按名称访问),您可以:

#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
Run Code Online (Sandbox Code Playgroud)

请注意,如果在使用弹出窗口后,您将需要返回到原始窗口,那么我建议您执行以下操作.通过将块传递给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
Run Code Online (Sandbox Code Playgroud)