使用Selenium Webdriver

时间:2015-12-04 07:13:07

标签: ruby internet-explorer selenium selenium-webdriver

我编写了一个Ruby脚本来使用IE自动执行某些用户操作。 我正在使用Selenium Web Driver for IE。以下是我的代码。

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':No   可以建立连接,因为目标机器主动拒绝   它。 - connect(2)for" 127.0.0.1" 5555港口(Errno :: ECONNREFUSED)           来自C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879:在'打开'           来自C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879:在'阻止连接'           来自C:/Ruby21/lib/ruby/2.1.0/timeout.rb:75:in&& 39; timeout'           来自C:/Ruby21/lib/ruby/2.1.0/net/http.rb:878:在' 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&#39 ;           来自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   ' raw_execute'           来自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   ' switchToWindow'           来自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:在''

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

2 个答案:

答案 0 :(得分:0)

我不是红宝石专家,但我也看到过类似的问题。我有一个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)

答案 1 :(得分:0)

在切换到新窗口之前,请尝试切换回顶级浏览上下文。

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)

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