2016-04-04 13 views
0

これまで実行したことがあります。コレクションの要素を処理するのはちょっとした苦労です。私の場合は、テーブルを解析し、列のセルに含まれる値をチェックしようとしています。ここ はコードです:テストは、このエラーで失敗 "row.cells [cell_index] .text.should == some_value" 行でWatirはコレクションから要素を見つけることができません

def check_cells_values(table, cell_index) 
table.rows.each do |row| 
    row.cells[cell_index].text.should == some_value 
end 
end 

Watir::Exception::UnknownObjectException: unable to locate element, using {:element=>#<Selenium::WebDriver::Element:0x7b40a27fd80f640e id="{af57e857-69ed-5345-a4ae-5ab80dff364a}">} 

それは単にに十分です行を繰り返し、各行からテキストを出力します。いくつかの行の後(ランダムに)、同じメッセージで失敗します。

ジャスティンがこの問題を扱っているこのリンクが見つかりましたが、要素のコレクションに結びついたものはどこにも見つかりませんでした。

更新: ここでは、解析している1つのテーブルの行の例を示します。

<tr class="dataRow even first" onclick="highlightElem(this)" onmouseover="if (window.hiOn){hiOn(this);} " onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}"> 
     <td class="dataCell " id="someid3" colspan="1"><a href="/url">8882</a></td> 
     <td class="dataCell " id="someid2" colspan="1"> 
      <label>Some kind of service</label></td> 
     <td class="dataCell " id="someid6" colspan="1"></td><td class="dataCell " id="someid7" colspan="1"><input class="btn" id="someid8" onclick="A4J.AJAX.Submit('pgToolOffer:pgForm',event,{'similarityGroupingId':'someid8','oncomplete':function(request,event,data){UpdatePopupPosition();},'parameters':{'selectedRatePlan':'Annual','selectedOfferFriendlyName':'Some service 50$','someid8':'someid8','selectedProduct':'Service Descrition','selectedOfferCode':'product\duration\x2DDG275'} });return false;" value="Show Offer Details" type="button"></td> 
    </tr> 
+0

あなたはそのコードのために得ている例外ですか?私は、 ''に対して未定義のメソッド 'each'があると期待します。つまり 'cells [given_index] .each'は有効ではありません。特定のセル、 'cells [given_index]'があると、繰り返し処理するものはありません。 –

+0

私はジャスティンと契約しています。 '.cells'はコレクションを返しますが、' .cells {index} 'は1つのセルになりますので、繰り返しは何もしません。 rows.ecell内のコードについては、 'row.cell(:index => given_index).text.should == expected_value'のようなものがあります。 –

+0

ごめんなさい、私は間違ったコード。私は必要な修正を加えました。しかし、1つの質問。 'row.cell(:index => given_index).text'は' row.cells [index] 'と同じです(' index'はコレクション内のセルの位置です)? –

答えて

0

まずオプション(厳密コード):

table.rows.each do |row| #We'll take each row 
    cell = row[given_index] #We'll take one cell of the taken row 
    puts cell.text #We'll do some stuff with the text of the cell 
end 

第二の選択肢(のは常にテーブルを再配置してみましょう):

i = 0 
table.rows.length.times do 
    table = b.table(id: "table") 
    puts table[i][given_index].text 
    i = i+1 
end 
+0

ポストのためにありがとう。しかし、これは役に立たない。本文を 'puts row.text'に置き換えても、コードは失敗します。私はまた質問の本文に更新しました。 –

+0

別の方法が追加されました。それはかなり汚い方法ですが、多分それが助けになるでしょう。 – Antesser

0

私はクライアント - と思われますページ上のサイド・ジャバスクリプト・コードがまだテーブルを構築しているか、オートメーションがそのテーブルとやりとりしている時点でテーブルを更新しています。

このような場合には、コードが動作するかどうかを確認するために、10秒または15秒のような大きな待ち時間を挿入することを試みます。私は通常、スリープを使って同期をとることを避けています(あまりにも短い(フレークテスト)または長すぎる(遅いテスト))ので、トラブルシューティングとデバッグのために速やかに同期の問題を特定できます。

あなたは同期の問題があることを知っていますし、ページが更新されたときにどのように伝えることができるのかをもっと深く見ることができます。通常、そのアップデートの終わり近くに作成されたいくつかの要素が存在し、 jQueryを使用するページでは、jQuery.active値(open ajax requests)を取得し、それがゼロになるのを待ってから、0.5秒間そこにとどまります。ページがクライアントサイドのAjax要求で完了し、テストが進行するための適切な状態にある可能性が高いことを伝える方法