2016-07-05 3 views
-3

Я хочу написать скрипт Ruby, чтобы проверить, найден ли слой, найденный в DOM в Firebug для страницы (например: 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 

Ниже ошибка я получил, когда я побежал srcipt в Netbeans.

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") вернется все, что доступно в содержании Google сайта для _gjwl. Хэш должен соответствовать тому, являются ли значения ключа одинаковыми, что есть в содержании сайта google. Поэтому сравните оба и посмотрите, совпадает ли это, обратный проход или сообщение об ошибке

Пожалуйста, помогите. Заранее спасибо.

+0

Это может помочь, если вы можете выяснить, что именно вы пытаетесь достичь. Код кажется фрагментированным, что затрудняет согласование его с описанием. Например, почему вы проверяете ключ в хеше, который вы создали? Почему вы сохраняете переопределение значений переменной слоя? –

+0

@ Justin Ko, чего я хочу достичь, - layer = browser.execute_script («return _gjwl») вернет все, что доступно в содержимом сайта google для _gjwl. Хэш должен соответствовать тому, являются ли значения ключа одинаковыми, что есть в содержании сайта google. Так что сравните оба и посмотрите, совпадает ли это, обратный проход или неудача – user2201935

+0

Кто-нибудь может мне помочь? – user1613245

ответ

1

Есть 2 проблемы:

  1. Вы пытаетесь сравнить слои в методе, но только иметь доступ к ожидаемому слою (не возвращенному браузером).
  2. Вы повторяете ожидаемые значения слоя, но проверяете себя только на клавиши.

Вот что вам нужно. Вы можете повторно использовать его в методах по мере необходимости.

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" 
+0

Justin Ko, спасибо вам большое ... но, я хочу написать это в виде функции, а затем вызвать ее в главном скрипте – user1613245

+0

Позвольте мне посмотреть, могу ли я попробовать – user2201935

+0

Можете ли вы уточнить, какую часть вы хотите в функция vs main script? Учитывая исходный пример, у вас есть целая часть функции (с добавлением построения сообщения, а не прямого вывода). –

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 
+0

Hi @mudasobwa. Что мне делать в главном скрипте, чтобы проверить, совпадает ли он? – user2201935

+0

ждет вашего ответа – user2201935

+0

«ждет вашего ответа» -Обратите внимание. – mudasobwa

Смежные вопросы