Watir&红宝石;一对初学者“我怎么能这样做”里面的问题

时间:2011-12-30 21:51:04

标签: ruby automation watir

在这里编程新手,大约一个月用Ruby。我目前正在玩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 个答案:

答案 0 :(得分:2)

  • 循环: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" } }

答案 1 :(得分:2)

Ruby有一个很棒的概念叫做iterables,可以帮助解决这个问题。

第一颗子弹。循环给定次数,例如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和密码值。 (我假设在那种情况下你会做一些事情,比如随机生成passwwords,因此需要存储它们)

将上述内容与.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 :(得分:0)

我要做的是为所有页面名称创建一个数组并迭代它。

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

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