【问题标题】:Ruby Global Variables After Refreshing Browser刷新浏览器后的 Ruby 全局变量
【发布时间】:2016-09-07 17:43:57
【问题描述】:

我对 Ruby 非常陌生,并且正在使用 Watir 开发脚本以进行验收测试,但我陷入了一个我什至不确定是否有可能摆脱的陈规之中。

我有一个运行的小脚本,它基本上查看下拉列表,将所有下拉项存储到一个全局变量中,然后我对其进行迭代并运行其他一些函数。

当我在运行每个下拉项的所有功能后尝试刷新浏览器时会出现此问题,然后尝试迭代到下一个下拉项并执行相同的功能,直到所有下拉项都完成。

$browser = Watir::Browser.new :chrome
$wait = Watir::Wait

def wait_while_loading(what)
    lightbox = $browser.div(:class , 'lightbox')

    begin
        # Capture load start
        start = Time.now

        $wait.until { lightbox.present? }
        $wait.until { !lightbox.present? }

        # Capture load end
        finish = Time.now
        load_time = (finish - start).to_s
    rescue => e
        print e.backtrace.join("\n")
        #log_error('Failed while loading ' + what + '.')
    end 
end

def cycle_all_views
    $views = []
    $current_view

    $view_dropdown = $browser.div(:id, 'views-dropdown') 

    $views = $browser.div(:class, 'dropdown-views').div(:class, 'dropdown-menu--footer').ul(:class, 'dropdown-menu').divs(:class, 'dropdown-menu-item')

    start_on_view = 10

    begin
        $views.drop(start_on_view).each_with_index do |view, i|     
            $view_dropdown.click

            $current_view = view.text
            index = i.to_s
            safe_name = sanitize($current_view)

            view.click
            wait_while_loading($current_view)

            $browser.refresh
            wait_while_loading('Refreshing Page...')
        end
    rescue => e
        #log_error('Failed to load view ' + $current_view)
    end
end

在触发$browser.refresh 后,在迭代到下一个view 后单击$views_dropdown,我收到一条错误消息,指出no implicit conversion of nil into String 假设在尝试执行$current_view = view.text 时。页面刷新后是否会丢失对变量的所有分配?如果是这样,有没有办法保留它们?

如果有人还可以为我指出调试 Watir 脚本的更好方法,我很想知道有什么方法可以让我的生活更轻松。

堆栈跟踪返回:

C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.3/lib/watir-webdriver/ele
ments/element.rb:536:in `assert_element_found'
C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.3/lib/watir-webdriver/ele
ments/element.rb:524:in `ensure_not_stale'
C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.3/lib/watir-webdriver/ele
ments/element.rb:503:in `assert_exists'
C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.3/lib/watir-webdriver/ele
ments/element.rb:81:in `text'
main.rb:55:in `block in cycle_all_views'
main.rb:52:in `each'
main.rb:52:in `each_with_index'
main.rb:52:in `cycle_all_views'
main.rb:122:in `block in <main>'
main.rb:112:in `each'
main.rb:112:in `<main>'Failed to load view First View

【问题讨论】:

  • 请发布您的错误的堆栈跟踪。
  • 堆栈跟踪发布到原始帖子。
  • 我非常喜欢 Rubymine 的调试器,用于处理 UI 测试。
  • 小心使用$ 全局变量。他们强烈建议您不了解变量范围的工作原理。如果有的话,你应该很少使用它们。
  • 感谢您的提醒。正如我所说,我正在学习非常感谢您指出这一点。

标签: javascript ruby watir acceptance-testing user-acceptance-testing


【解决方案1】:

答案几乎就是我放在这里的:https://*.com/a/39332788/4072371

使用索引而不是遍历集合

【讨论】:

    【解决方案2】:

    这里有一个例子说明了这个问题(它--在信用到期的地方给予信用--titusfortner 确定):

    require 'watir-webdriver'
    b = Watir::Browser.new :chrome
    b.goto('http://www.iana.org/domains/reserved')
    
    first_link_from_divs = b.div(id: "sidebar_left").links.first
    first_link_from_divs.text                                       #=> Overview
    first_link_from_divs.exists?                                    #=> true
    
    just_a_link = b.link(text: "Overview")
    just_a_link.text                                                #=> Overview
    just_a_link.exists?                                             #=> true
    
    b.refresh
    first_link_from_divs.exists?                                    #=> false
    just_a_link.exists?                                             #=> true  
    

    【讨论】: