Ruby 如何在SeleniumWebDriver中获取窗口标题、ID和名称?
我正在尝试从SeleniumWebDriver(ruby)中实现以下方法Ruby 如何在SeleniumWebDriver中获取窗口标题、ID和名称?,ruby,selenium,webdriver,Ruby,Selenium,Webdriver,我正在尝试从SeleniumWebDriver(ruby)中实现以下方法 获取所有窗口ID 获取所有窗口标题 获取所有窗口名称 我运行Selenium IDE并将脚本导出到Ruby Test::Unit。保存为.rb 使用Aptana Studio 3打开我的脚本进行编辑 初始代码段如下所示: 需要“rubygems” 需要“selenium webdriver” 需要“测试/单元” 类SwitchToPopup3
- 获取所有窗口ID
- 获取所有窗口标题
- 获取所有窗口名称
需要“rubygems”
需要“selenium webdriver”
需要“测试/单元”
类SwitchToPopup3
我经常犯的错误是
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'
NoMethodError:get#u all_window_id”的未定义方法
/用户/rsucgang/Documents/aptanastudio3工作区/Testing/SwitchToPopup2.rb:37:in'test_switch_to_popup3'
我已经研究了SeleniumWebDriver的ruby绑定文档
最终,我的目标是运行我的自动化脚本:
- OSL Mac OSX 10.7.3
- Ruby:Ruby 1.8.7(2010-01-10补丁级别249)[通用达尔文11.0]
- 浏览器:Firefox 9.0.1(Mac)
- 铬:铬17.0.963.79(Mac)
- Selenium服务器:Ruby gem 2.20.0
get\u all\u窗口\u id
是针对Selenium::Client而不是Selenium::Webdriver的。我相信Selenium::Client是旧版本的Selenium,API与Selenium::Webdriver不同(请参阅)。由于您使用的是Selenium::Webdriver,这就解释了为什么会出现“undefined method”错误
对于Selenium::Webdriver,我知道如何在windows之间切换的唯一方法是使用:
@driver.switch_to.window("<window_handle>")
如果您想切换到刚才打开的弹出窗口,可以执行以下操作。请注意,这假设.window\u句柄
与窗口打开的顺序一致,我相信这是正确的:
@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
请注意,如果在使用弹出窗口后,您希望返回到原始窗口,那么我建议您执行以下操作。通过将一个块传递到切换到.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
贾斯汀,你的方法很好。但是,假设窗口句柄将以正确的顺序返回是有问题的。并非所有浏览器都是如此。我在每周免费的硒提示时事通讯(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/
你可以看到完整的提示。+1,我很少在SA上看到这样一篇记录完整的第一篇帖子。只是一个小编辑。错误消息包含“browser=:chrome”,而我的代码表明驱动程序用于:firefox。我在运行:chrome实例时粘贴了错误代码。无论如何,两个浏览器驱动程序仍然会产生相同的noMethodError消息。谢谢你,贾斯汀!你的解释有道理。我刚试过,效果很好。很好!我真不敢相信这没有得到更多的选票!
#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
@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/