0

我已经重写了这个问题,使它更有意义。

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

这将是这样的场景:

  1. 用户选择分行编号,02
  2. 用户选择一个人类型,传教士
  3. 生成一个新的传教士名字动态选择列表

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

4 回答 4

3

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

@myArray = Array.new

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

由于“选项”为您提供了数组格式的所有选项,您也可以(并且可能应该)这样做:

@myArray = @browser.select_list.options

根据您的评论进行更新 - 该代码生成了您正在寻找的列表,但您没有指定您要使用它做什么。您看到的输出是列表的 Ruby 对象格式。以与我们迭代上述项目相同的方式,您可以迭代您的数组选项:

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

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

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

我们有一个数组。我们知道这个 Array 包含 select_list 中的所有单个选项。我们可以使用任何 Ruby 数组方法然后对这些数据做一些事情。如果我们想要选项总数:

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

同样,您可以使用此数组 delete_at,您可以对其内容重新排序,或者您可以像我在更新 #1 中所做的那样显示每个项目。

于 2012-05-07T23:02:13.483 回答
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

所以在上面的例子中,它会等到第一个选项的文本发生变化,然后才会计算列表中的选项。我选择 options[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)
于 2012-05-09T18:44:34.183 回答
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 之间给出了不同的结果。
于 2012-05-08T18:24:18.830 回答
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。

于 2012-05-08T20:29:02.590 回答