一尘不染

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

selenium

我正在尝试从 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 #    <Selenium::WebDriver::Driver:0x101e4b040 browser=:chrome>
    /Users/rsucgang/Documents/Aptana Studio 3 Workspace/Testing/SwitchToPopup2.rb:37:in `test_switch_to_popup3'

我研究了selenium-webdriver的红宝石绑定文档

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:uby1.8.7(2010-01-10补丁程序级别249)[universal-darwin11.0]
  • Firefox:Firefox 9.0.1(Mac)
  • Chrome:Chrome 17.0.963.79(苹果机)
  • Selenium-Server:Ruby gem 2.20.0

阅读 1189

收藏
2020-06-26

共1个答案

一尘不染

问题是,get_all_window_ids它用于Selenium :: Client而不是Selenium ::
Webdriver。我相信Selenium :: Client是旧版本的Selenium,并且API与Selenium ::
Webdriver不同(请参见此处)。由于您使用的是Selenium
:: Webdriver,因此可以解释为什么出现“未定义的方法”错误。

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

@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
2020-06-26