使用Ruby将动态列表捕获到数组

时间:2012-05-07 22:51:05

标签: ruby watir selectlist

我重写了这个问题,以便更有意义。

有没有办法让Ruby能够在网页上监听新创建的(动态)选择列表并将该列表保存到数组中?

这将是情景:

  1. 用户选择分支编号02
  2. 用户选择一个人类型,传教士
  3. 生成一个新的动态选择传教士名单
  4. Ruby需要捕获动态创建的名称列表并将其保存到数组中。这是迄今为止的代码:

    missionaries = Array.new
    
    browser.select_list(:id,'branch_select').select_value('02')
    browser.select_list(:id,'user_type_select').select_value('1') # 1 = Missionary
    browser.select_list(:index,2).click # <-This is the dynamically created list
    missionaries = browser.select_list(:index,2) # <-This is just a guess, doesn't work
    puts "Missionary List: " + missionaires.to_s # <-Prints to verify list saved
    

    这实际打印到屏幕的是:

     Missionary List: #<Watir::Select:0x147e54e>
    

4 个答案:

答案 0 :(得分:3)

有许多不同的ruby-tastic方法可以收集信息到数组(如收集等),这里有一个:

@myArray = Array.new

@browser.select_list(:how, what).options.each do |option|
  @myArray << option
end

由于“options”为您提供了Array格式的所有选项,您也可以(也可能应该)执行以下操作:

@myArray = @browser.select_list.options

根据您的评论进行更新 - 该代码生成了您要查找的列表,但您没有指定要查找的内容。您看到的输出是列表的Ruby Object格式。以同样的方式迭代上面的项目,您可以遍历数组选项:

@num = 0
@myArray.each do |option|
   @num += 1
   puts "#{@num}. option"
end
  • 输出看起来像:
    1. 棒球
    2. 篮球
    3. 水下篮筐

您可以将它们写入文件,控制台,保存它们等。这些都是简单的Ruby要做的事情。希望有所帮助!

根据您的评论更新#2:我相信您需要简化您对应用程序的思考方式。我们不再谈论传教士或篮球甚至是网页。由于我们已经确定了您需要访问的对象(select_list),并将其数据拉入数组,因此我们现在可以对其执行操作。

我们有一个数组。我们知道此Array包含select_list中的所有单个选项。我们可以使用任何Ruby Array方法对此数据执行某些。如果我们想要选项的总数:

@myArray.length
(basically, @browser.select_list.options.length)

同样,您可以使用此数组删除delete_at,可以重新排序其内容,也可以像我在更新#1中那样显示每个项目。

答案 1 :(得分:1)

试试这个:

missionaries = Array.new

browser.select_list(:id,'branch_select').select_value('02')
browser.select_list(:id,'user_type_select').select_value('1') # 1 = Missionary
browser.select_list(:index,2).click # <-Assuming this is the dynamic list
missionaries = browser.select_list(:index,2).options.collect{ |x| x.text } #Create an array containing the text of each option in the dynamic list
puts "Missionary List: " + missionaires.to_s # <-Prints to verify list saved
puts missionaires.length # <-Prints number of options in dynamic list

请注意,这基本上是亚当的建议,基于以下假设进行了一些改进:

  1. 您对选项集合不感兴趣。相反,您需要一个包含动态下拉列表文本的数组。
  2. 根据您输出到missionaires.to_s,您使用的是Watir-Webdriver,而不是经典的Watir。根据我的测试,OptionCollection.to_s在Watir和Watir-Webdriver之间给出了不同的结果。

答案 2 :(得分:1)

为了扩展我的评论,我找到了一个问题的示例,我认为您在获取返回给您的选项数量时遇到的问题

b是我的浏览器实例,因为我很懒。

b.goto("http://remysharp.com/wp-content/uploads/2007/01/select.html")
b.select_list(:id => "ctlJob").select("Developer")
puts b.select_list(:id => "ctlPerson").options.count
=> 3

所以在上面的例子中它输出3(我期待2),因为当时动态列表没有时间更新。内容刷新通常需要一秒或更长时间。如果我调整示例等待,它应该(并且确实)为我返回正确的数字。

b.goto("http://remysharp.com/wp-content/uploads/2007/01/select.html")
b.select_list(:id => "ctlJob").select("Developer")
sleep 5
puts b.select_list(:id => "ctlPerson").options.count
=> 2

这次你得到正确数量的选项,因为它有时间更新列表中的选项(在睡眠期间),这样当你要求Watir给你计数时,它会返回正确的数字而不是“过时的”之一。

但是让我们面对现实吧,睡觉就是魔鬼。根据我的经验,明智的做法是不要使用超出“我正在考虑的时间问题吗?”的睡眠。调试情况。

那么我们如何才能改善上述脚本的行为?在计算选项之前给它一个等待的条件。

b.goto("http://remysharp.com/wp-content/uploads/2007/01/select.html")
original_option = b.select_list(:id => "ctlPerson").options[1].text
b.select_list(:id => "ctlJob").select("Developer")
# Pay attention to the line below
b.wait_until{b.select_list(:id => "ctlPerson").options[1].text != original_option}
puts b.select_list(:id => "ctlPerson").options.count

因此,在上面的示例中,它会等到第一个选项的文本发生更改,然后才会计算列表中的选项。我选择了选项[1],因为通常有一个“选择...”默认选项,所以如果你使用0,它会等到它在很多情况下超时。

所以是的,我认为这个页面上的很多其他答案都会给你一个0来计算,因为当Watir看到它时,选择列表真的是空的,而之后只有页面动态更新列表。

编辑:

关于如何根据您提供的示例

进行讨论的示例
browser.select_list(:id,'branch_select').select_value('02')
browser.select_list(:id,'user_type_select').select_value('1') # 1 = Missionary
# Im not sure you need to click here at all
browser.select_list(:index,2).click # <-This is the dynamically created list
# As the other answers were all returning zero, lets wait until the option count is higher
browser.wait_until{browser.select_list(:index,2).options.count > 0}
missionaries = browser.select_list(:index,2).options.count
# Potentially minus 1 if there's a "Select..." option
assert(missionaries == number_im_expecting)

答案 3 :(得分:0)

好的,我已经明白了。该列表由JSON调用动态填充。我必须做的是首先弄清楚当选择第二个列表项时会发生什么(在这种情况下,是传教士)。选择该选项后,会立即发送GET请求,然后收到JSON字符串。

Ruby必须使用open-uri gem / library捕获字符串。然后使用json gem解析。之后,我使用正则表达式来计算找到新id的次数。这是新代码:

browser.select_list(:id,'branch_select').select_value('01')
browser.select_list(:id,'user_type_select').select_value('1') 
browser.select_list(:index,2).click
json = open("http://10.5.26.9:8080/MissionaryLetters/getUsers?branchID=01&userTypeID=1").read
json = JSON.parse(json)
puts json
missionaries = json.to_s.scan(/id\d/).length
puts missionaries

这将打印在该处发现的传教士数量,在这种情况下为16。