为了扩展我的评论,我找到了一个我认为您在获得返回给您的选项数量时遇到的问题的示例
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)