Watir & Ruby; Пара начинающих "как я могу это сделать" - PullRequest
0 голосов
/ 31 декабря 2011

Программирование новичка здесь, около месяца с Руби. В настоящее время я играю с Watir и у меня есть несколько вопросов, чтобы упростить процесс автоматизации простого заполнения формы.

Текущий код:

# Start Watir
require 'watir-webdriver'
# Open Firefox w/ Watir
browser = Watir::Browser.new :ff
# Visit URL w/ browser
browser.goto("http://website.com")
# Fill in page name field
browser.text_field(:name => "page_name").set "page_name1"
# Fill in password field
browser.text_field(:name => "password").set "static_password"
# Click publish button
browser.button(:value => "Publish").click
# Puts URL
puts browser.url

Что я хотел бы добавить к этому:

  • Цикл процесса XXX раз (do, end?)
  • Извлечь имя страницы из упорядоченного списка (массива?), Не использовать одно и то же имя дважды
  • После публикации страницы сгруппируйте и сохраните имя страницы + URL + пароль (хеш?)

Любое руководство по этому вопросу высоко ценится, я не слишком далеко загадаю, мне просто нужен толчок в правильном направлении.

Ответы [ 3 ]

2 голосов
/ 31 декабря 2011

В Ruby есть замечательная концепция, называемая итерациями, которая может помочь с этим.

Первая пуля. зацикливание заданное количество раз, скажем, 100, например. Существует около 10 различных способов облысения этого кота, но мой любимый именно этот

100.times do
  #code lines to be repeated
end

Второй пункт, который, вероятно, меняет подход, предполагая, что вы хотите сделать что-то один раз для каждой строки в массиве имен сайтов.

Сначала создайте свой массив, а затем используйте замечательный метод .each, чтобы что-то делать с каждой строкой массива. Если ваш массив был назван page_names, тогда

page_names.each do |name|
  #code to be repeated, use `name` variable at point you need the value
  browser.text_field(:name => "page_name").set name
end

Этот метод .each можно использовать практически с любой «коллекцией» предметов, что означает, что вы можете в конечном итоге делать вещи, которые выглядят следующим образом

pages.each do |page|
  code that does something with page.name
  code that does something with page.password
end

Третья пуля, да, у Майкла (которого я видел, только что опубликовал ответ) есть то, что я бы предложил, это вложенный хеш, хотя, поскольку вы начинаете с имен страниц, и это та часть, которую вы знаете, а URL-адрес что-то, что собирает скрипт, я бы использовал page_name как ключ к внешнему хешу, который позволил бы вам искать значения url и пароля для каждого имени страницы. (Я предполагаю, что в этом случае вы будете делать что-то вроде случайного генерирования паролей и, следовательно, необходимости их хранения)

В сочетании с .each важно знать, что в случае использования .each с хешами, первое, что вы получите от .each, это ключ, а затем значение. Так что, если у вас был вложенный хэш, описанный выше, предварительно заполненный паролями и введенный с именами страниц, вы можете сделать что-то вроде этого

pages.each do |page_name, pageinfo|
  browser.goto("http://website.com")
  browser.text_field(:name => "page_name").set page_name
  browser.text_field(:name => "password").set pageinfo[:password]
  browser.button(:value => "Publish").click
  pages[page_name][:url] = browser.url
end

(учитывая, что Мерфи любит меня, я полагаю, что я допустил некоторую ошибку выше, которую, без сомнения, обнаружит еще один самый серьезный случай. К счастью, вы можете отредактировать эти ответы, чтобы исправить это позже)

2 голосов
/ 31 декабря 2011
  • Цикл: xxx.times do ... end
  • Массив имени страницы: page_names.each do |page_name| ... end
  • Как насчет вложенного хэша?Используйте URL в качестве ключа для внешнего хэша, а имя и пароль в качестве ключей во внутреннем хэше.
{ "http://foo.com" => { :name => "Foo", :password => "super_s3kr3t" }
  "http://bar.com" => { :name => "Bar", :password => "also_s3kr3t" } }
0 голосов
/ 31 декабря 2011

Что я хотел бы сделать, это создать массив для всех имен страниц и перебрать его.

pages = ["page_name1", "page_name2", "page_name3"]

pages.each {|page| browser.text_field(:name => "page_name").set page}
...