0

この質問をもっと意味のあるものに書き直しました。

RubyがWebページで新しく作成された(動的な)選択リストをリッスンし、そのリストを配列に保存できるようにする方法はありますか?

これはシナリオになります:

  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

配列に情報を収集するためのさまざまなルビータスティックな方法(収集など)がありますが、次の1つがあります。

@myArray = Array.new

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

「options」はすべてのオプションを配列形式で提供するため、次のことも実行できます(おそらく実行する必要があります)。

@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)を特定し、そのデータを配列にプルしたので、これでアクションを実行できます。

配列があります。この配列には、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を期待しています)。多くの場合、コンテンツが更新されるまでに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)
于 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

これは基本的に、次の仮定に基づいていくつかの改良を加えたAdamの提案であることに注意してください。

  1. オプションコレクションには興味がありません。代わりに、動的ドロップダウンのテキストを含む配列が必要です。
  2. への出力に基づいて、missionaires.to_s従来のWatirではなくWatir-Webdriverを使用しています。私がテストしたものから、OptionCollection.to_sはWatirとWatir-Webdriverの間で異なる結果を出します。
于 2012-05-08T18:24:18.830 に答える
0

OK、わかりました。リストはJSON呼び出しによって動的に入力されていました。私がしなければならなかったことは、最初に2番目のリスト項目(この場合は宣教師)が選択されたときに何が起こるかを理解することです。それが選択されるとすぐに、GETリクエストが送信され、JSON文字列が受信されました。

文字列は、open-uri gem/libraryを使用してRubyでキャプチャする必要がありました。次に、jsongemを使用して解析します。その後、正規表現を使用して、新しい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 に答える