你如何在selenium-webdriver中获得窗口标题,ID和名称?
我试图从selenium-webdriver (ruby)实现以下方法
- 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 # /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
最终我的目标是运行我的自动化脚本:
- 单击一个链接,打开一个新窗口,其中包含target = _blank,并且没有可用的windowID(未实现JS)
- 在浏览器中标识所有打开的窗口的名称
- 使用switchToWindow(name)方法切换到新的弹出窗口
- 继续在该弹出窗口中运行我的脚本
我在网上搜索并研究了这个,我没有得到任何太多的信息。
谢谢,如果您需要更多信息,请告诉我。
- 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/
你可以在这里看到完整的提示。