我想编写一个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网站内容中的所有内容。哈希是为了匹配谷歌网站内容中的关键值是否相同。因此,比较两者并查看它是否匹配,通过消息返回通过或失败
请帮忙。提前谢谢。
答案 0 :(得分:1)
有两个问题:
这是你需要的。您可以根据需要将其重新分解为方法。
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_layer
是Hash
个实例。迭代哈希将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