刷新浏览器后的Ruby全局变量
Ruby Global Variables After Refreshing Browser
我对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
,当尝试做$current_view = view.text
时,我看到一个错误,说明no implicit conversion of nil into String
假设。在页面刷新后,我是否丢失了对变量的所有赋值?如果是这样,有办法留住他们吗?
如果有人能给我指出更好的调试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
答案就在这里:https://stackoverflow.com/a/39332788/4072371
使用index代替遍历集合
下面是一个例子,说明了这个问题(这——应该归功于——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
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 在节点中创建文件全局变量
- 在Javascript中使用全局变量作为缓存是很好的
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 函数中的innerHTML(全局变量?)
- 如何在javascript中为全局变量赋值
- 刷新浏览器后的Ruby全局变量
- 如何传递一个javascript全局变量到requirejs, ruby on rails