Ruby脚本抛出错误

时间:2016-07-05 12:18:33

标签: 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'     => '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_script("return _gjwl")将返回_gjwl的Google网站内容中的所有内容。哈希是为了匹配谷歌网站内容中的关键值是否相同。因此,比较两者并查看它是否匹配,通过消息返回通过或失败

请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:1)

有两个问题:

  1. 您正在尝试比较方法中的图层,但只能访问预期的图层(不是浏览器返回的图层)。
  2. 您正在迭代预期的图层值,但只检查自己的密钥。
  3. 这是你需要的。您可以根据需要将其重新分解为方法。

    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"
    

答案 1 :(得分:0)

page_layerHash个实例。迭代哈希将key, value对传递给块。您正试图在其上拨打has_key?

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

有人可能会这样做:

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

或:

page_layer.each do |key, value|
  message.push("#{value} matches") if key == 'host'
end