【问题标题】:Error while switching windows using Selenium Webdriver使用 Selenium Webdriver 切换窗口时出错
【发布时间】:2016-03-09 01:27:51
【问题描述】:

我编写了一个 Ruby 脚本来使用 IE 自动执行一些用户操作。 我正在为 IE 使用 Selenium Web 驱动程序。下面是我的代码。

require 'selenium-webdriver'

browser = Selenium::WebDriver.for :ie

first_window = browser.window_handle
browser.switch_to.frame(browser.find_element(:id=> 'outerFrame'))
browser.switch_to.frame(browser.find_element(:id=> 'innerFrame'))

table_rows = browser.find_element(:id=> 'AllItems').find_element(:tag_name=> 'table').find_elements(:tag_name=> 'tr')
count_cell = table_rows.at(table_rows.length-1).find_elements(:tag_name=> 'td').at(1).find_element(:tag_name=> 'a')
count_cell.click

sleep(5)

all_windows = browser.window_handles
new_window = browser.window_handles.last

browser.switch_to.window(new_window)

btn = browser.find_element(:id=> 'btn_export')
btn.click

在某一时刻,单击一个按钮后,会打开一个新页面。现在,当我尝试切换到新窗口时,出现以下错误。

C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879:in 'initialize': 否 可以建立连接,因为目标机器主动拒绝 它。 - 为“127.0.0.1”端口 5555 连接(2)(Errno::ECONNREFUSED) 来自 C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879:in 'open' 来自 C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879:in 'block in connect' 来自 C:/Ruby21/lib/ruby/2.1.0/timeout.rb:75:in 'timeout' 来自 C:/Ruby21/lib/ruby/2.1.0/net/http.rb:878:in 'connect' 来自 C:/Ruby21/lib/ruby/2.1.0/net/http.rb:863:in 'do_start' 来自 C:/Ruby21/lib/ruby/2.1.0/net/http.rb:852:in 'start' 来自 C:/Ruby21/lib/ruby/2.1.0/net/http.rb:1375:in 'request' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/remote/http/default.rb:107:in 'response_for' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/remote/http/default.rb:58:in '要求' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/remote/http/common.rb:59:in '称呼' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/remote/bridge.rb:664:in '原始执行' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/remote/bridge.rb:642:in '执行' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/remote/bridge.rb:216:in '切换到窗口' 来自 C:/Ruby21/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/common/target_locator.rb:81:in '窗户' 来自 script.rb:18:in ''

我尝试通过修改防火墙并为端口 5555 添加规则来解决错误。即便如此,问题仍然存在。我发现了一些已经存在的问题,但大多数都与 Java 或 .Net 有关。如何解决此错误?谁能指出我正确的方向?

【问题讨论】:

  • 在 chrome 或 firefox 上会发生同样的事情吗?
  • 该站点是特定于 IE 的。它不会在其他浏览器上打开。
  • 在点击进入新窗口之前保存第一个网页的窗口句柄然后点击,操作完成后使用保存的窗口句柄返回原始屏幕
  • 我目前也在做同样的事情。 “count_cell.click”是打开一个新页面的步骤。
  • 如果您可以提供一些 html/css/js 来重现该问题,它可能有助于我们调试。可以重现它的最简单的例子。

标签: ruby internet-explorer selenium selenium-webdriver


【解决方案1】:

我不是红宝石专家,但我看到过类似的问题发生。我有一个 Python-ic 解决方案。您需要做的就是 Ruby-fy 代码。 https://gist.github.com/ab9-er/08c3ce7d2d5cdfa94bc7

def change_window(browser):
    """
    Simple window switcher without the need of playing with ids.
    @param browser: Current browser instance
    """
    curr = browser.current_window_handle
    all_handles = browser.window_handles
    for handle in list(set([curr]) - set(all_handles)):
        return browser.switch_to_window(handle)

【讨论】:

  • 不管怎样,他使用的 Ruby 代码是在 Ruby 中切换到窗口的合适方法。
【解决方案2】:

在切换到新窗口之前尝试切换回*浏览上下文。

browser.switch_to.default_content
current_window = browser.window_handle
new_window = browser.window_handles.find { |win| win != current_window }
browser.switch_to.window(new_window)

它应该隐式执行此操作,因此如果不是,则可能是一个错误。如果可行,请告诉我,以便我查看是否需要提交错误报告。

【讨论】:

  • 你能确认有多个窗口打开吗?您能否验证此代码适用于 Firefox 或 Chrome?
  • 另外,提醒我窗口句柄没有按任何顺序返回,所以我修改了我提供的代码。