【问题标题】:How do you get window titles, ids, and names in selenium-webdriver?如何在 selenium-webdriver 中获取窗口标题、ID 和名称?
【发布时间】:2012-03-30 08:25:54
【问题描述】:

我正在尝试从 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. 初始代码sn-p如下:
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'

我研究了 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 补丁级别 249)[universal-darwin11.0]
  • 浏览器:Firefox 9.0.1 (Mac)
  • Chrome:Chrome 17.0.963.79 (Mac)
  • Selenium 服务器:Ruby gem 2.20.0

【问题讨论】:

  • +1,我很少在 SA 上看到如此有据可查的第一篇文章。
  • 只是一个小改动。错误消息包含“browser=:chrome”,而我的代码表明驱动程序用于:firefox。我在运行 :chrome 实例时粘贴了错误代码。无论如何,两个浏览器驱动程序仍然会产生相同的 noMethodError 消息。

标签: ruby selenium webdriver


【解决方案1】:

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

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

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

您可以通过以下方式获取所有已知的 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

【讨论】:

  • 谢谢贾斯汀!你的解释很有道理。我刚试了一下,效果很好。
【解决方案2】:

贾斯汀,你的方法很好。但是假设窗口句柄将以正确的顺序返回是有问题的。在所有浏览器中并非总是如此。我在我的免费每周 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/  

你可以看到完整的提示here

【讨论】:

  • 不错!我不敢相信这没有得到更多的支持!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多