Ruby on rails Ruby脚本抛出错误

Ruby on rails Ruby脚本抛出错误,ruby-on-rails,ruby,watir,Ruby On Rails,Ruby,Watir,我想编写一个Ruby脚本来检查Firebug中DOM中找到的页面层是否与脚本中声明的哈希值匹配,例如:www.google.com。下面是我编写的Ruby脚本: require 'watir' browser = Watir::Browser.new(:chrome) browser.goto('www.google.co.in') #Function def page_data_layer(browser) page_layer = { 'host' =

我想编写一个Ruby脚本来检查Firebug中DOM中找到的页面层是否与脚本中声明的哈希值匹配,例如:www.google.com。下面是我编写的Ruby脚本:

require 'watir'

browser = Watir::Browser.new(:chrome)

browser.goto('www.google.co.in')

#Function
def page_data_layer(browser)
    page_layer  = {
        'host'     => 'www.google.co.in',
        'hostname' => 'www.google.co.in',
        'pathname' => '/',
        'protocol' => 'https:'
    }

    if page_layer.each do |data|
        data.has_key?('host')
            message.push("#{data['host']} matches")
        end
    end

    return message.join("\n")
end

#Main script
layer = page_data_layer(browser)

layer = Hash.new{|key,value| key[value] =
                  Hash.new(&key.default_proc)}

layer = browser.execute_script("return _gjwl")

log < layer
以下是我在Netbeans中运行srcipt时遇到的错误

C:/Users/ruby_script.rb:17:in `block in page_data_layer': undefined method `has_key?' for ["host", "www.google.co.in"]:Array (NoMethodError)
        from C:/Users/ruby_script.rb:16:in `each'
        from C:/Users/ruby_script.rb:16:in `page_data_layer'
        from C:/Users/ruby_script.rb:26:in `<main>'
我想要实现的是-layer=browser.execute_scriptreturn_gjwl将返回谷歌网站上任何可用的内容。散列是为了匹配键值是否与google站点内容中的键值相同。所以比较两者,看看是否匹配,返回pass或fail-through消息

请帮忙。提前感谢。

页面层是一个哈希实例。迭代散列将密钥、值对传递给块。你想打电话给has_key?关于它:

可以这样做:

message.push("#{data['host']} matches") if page_layer.has_key?('host')
或:

有两个问题:

您正在尝试比较方法中的层,但只能访问期望的层,而不能访问浏览器返回的层。 您正在迭代预期的层值,但只检查自身的关键点。 这是你需要的。您可以根据需要将其重新考虑到方法中

require 'watir-webdriver'
browser = Watir::Browser.new :chrome
at_exit { browser.close }
browser.goto('www.google.co.in')

page_layer  = {
   'host'     => 'www.google.co.in',
   'hostname' => 'www.google.co.in',
   'pathname' => '/',
   'protocol' => 'https:'
}

layer = browser.execute_script("return _gjwl")
# => {"ancestorOrigins"=>[], "assign"=>{}, "hash"=>"", "host"=>"www.google.co.in", "hostname"=>"www.google.co.in", "href"=>"https://www.google.co.in/?gws_rd=ssl", "origin"=>"https://www.google.co.in", "pathname"=>"/", "port"=>"", "protocol"=>"https:", "reload"=>{}, "replace"=>{}, "search"=>"?gws_rd=ssl"}

page_layer.each do |key, value|
    # Output key being checked
    p key

    # Check if the value returned from the browser matches the expected value
    p value == layer[key]
end
其结果如下:

"host"
true
"hostname"
true
"pathname"
true
"protocol"
true
在测试结果方面,您可能应该研究一些测试框架。它们提供了功能强大的比较工具和报告,所需工作量大大减少。例如,如果使用RSpec,比较值将非常简单:

expect(layer).to include(page_layer)
如果希望它是一个返回组合结果消息的方法:

def page_data_layer(layer)
  page_layer  = {
    'host'     => 'www.google.co.in',
    'hostname' => 'www.google.co.in',
    'pathname' => '/',
    'protocol' => 'https:'
  }

  page_layer.map do |key, value|
    result = value == layer[key] ? 'matches' : 'does not match'
    "#{key} #{result}"
  end.join("\n")
end

layer = browser.execute_script("return _gjwl")
puts page_data_layer(layer)
#=> "host matches"
#=> "hostname matches"
#=> "pathname matches"
#=> "protocol matches"

你好,mudasobwa。我应该在主脚本中做什么来检查它是否匹配?等待你的答案“等待你的答案”-很酷知道。我已经删除了等待你的回答——我的意思是关于主脚本,问我哪里出错了。如果我的评论伤害了你,真的很抱歉。有人能帮我吗?如果你能澄清你到底想实现什么,也许会有帮助。代码看起来很零碎,这使得它很难与描述保持一致。例如,为什么要在创建的哈希中检查密钥?你为什么一直在给layer变量赋值?@Justin Ko我想实现的是-layer=browser.execute\u scriptreturn\u gjwl将返回谷歌网站内容中可用的任何内容。散列是为了匹配键值是否与google站点内容中的键值相同。因此,比较两者,看看是否匹配,返回通过或失败有人可以帮我吗?Justin Ko,非常感谢你…但是,我想以函数的形式写这篇文章,然后在主脚本中调用它让我看看我是否可以尝试你能澄清你想要在函数与主脚本中的哪个部分?在最初的示例中,我们在函数中添加了构建消息(而不是直接输出)的整个部分。我希望哈希页面层具有“code”页面层。每个do |键,值|;p键;p值==层[键];在函数中结束'code',并且只有'code'层=browser.execute_scriptreturn _gjwl'code'的匹配应该在主脚本中。可能吗?我的意图是,大部分可能的代码都应该包含在函数中,这样它就可以用于更多的主脚本。谢谢,先生……你让我高兴极了
expect(layer).to include(page_layer)
def page_data_layer(layer)
  page_layer  = {
    'host'     => 'www.google.co.in',
    'hostname' => 'www.google.co.in',
    'pathname' => '/',
    'protocol' => 'https:'
  }

  page_layer.map do |key, value|
    result = value == layer[key] ? 'matches' : 'does not match'
    "#{key} #{result}"
  end.join("\n")
end

layer = browser.execute_script("return _gjwl")
puts page_data_layer(layer)
#=> "host matches"
#=> "hostname matches"
#=> "pathname matches"
#=> "protocol matches"