私のコメントを拡張するために、私はあなたがあなたに返されるオプションの数を取得するときにあなたが経験していると思う問題の例を見つけました
私は怠け者なので、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を期待しています)。多くの場合、コンテンツが更新されるまでに1秒以上かかることがあります。例を微調整して待つと、正しい番号が返されるはずです(実際に返されます)。
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
したがって、上記の例では、最初のオプションのテキストが変更されるまで待機してから、リスト内のオプションの数を取得します。「Select...」のデフォルトオプションがよくあるので、options [1]を選択しました。したがって、0を使用すると、多くの場合、タイムアウトになるまで待機します。
そうですね、このページの他の多くの回答は、Watirがリストを表示しているときに選択リストが本当に空であり、ページが動的にリストを更新した後でのみ、カウントに対して0を返していたと思います。
編集:
だから、あなたがあなたが提供した例に基づいてそれをどのように進めるかもしれないかの例のために
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)