Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在SeleniumWebDriver中获取窗口标题、ID和名称?_Ruby_Selenium_Webdriver - Fatal编程技术网

Ruby 如何在SeleniumWebDriver中获取窗口标题、ID和名称?

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

我正在尝试从SeleniumWebDriver(ruby)中实现以下方法

  • 获取所有窗口ID
  • 获取所有窗口标题
  • 获取所有窗口名称
  • 我运行Selenium IDE并将脚本导出到Ruby Test::Unit。保存为.rb
  • 使用Aptana Studio 3打开我的脚本进行编辑
  • 初始代码段如下所示:
  • 需要“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绑定文档

    最终,我的目标是运行我的自动化脚本:
  • 单击一个链接,打开一个新窗口,目标为空且没有可用的windowID(不实现JS)
  • 识别浏览器中所有打开窗口的名称
  • 使用switchToWindow(名称)方法切换到新的弹出窗口
  • 继续在弹出窗口上运行我的脚本
  • 我在互联网上搜索并研究过这个问题,但我没有得到多少信息

    谢谢,如果您需要更多信息,请告诉我

    • 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/