2013-12-11 26 views
5

部分href xpathを使用してHTML表の行をスキャンし、その行の他の列の値でさらにテストを実行しようとしています。キュウリ、JVMステップ定義でCapybaraでHTML表の行を取得する方法

<div id = "blah"> 
    <table> 
    <tr> 
     <td><a href="afile?key=HONDA">link</a></td> 
     <td>29 33 485</td> 
     <td>45.2934,00 EUR</td> 
    </tr> 
    <tr> 
     <td><a href="afile?key=HONDA">link</a></td> 
     <td>22 93 485</td> 
     <td>38.336.934,123 EUR</td> 
    </tr> 
    <tr> 
     <td><a href="afile?key=something_else">link</a></td> 
     <td>394 27 3844</td> 
     <td>3.485,2839 EUR</td> 
    </tr>  
    </table> 
    </div> 

、私は以下のように非常に簡単にこれを行って(私はルビーを使用して、より快適にしています)

@Given("^if there are...$") 
public void if_there_are...() throws Throwable { 
      ... 
      ... 
      baseTable = driver.findElement(By.id("blah")); 
      tblRows = baseTable.findElements(By.tagName("tr")); 

     for(WebElement row : tblRows) {             
      if (row.findElements(By.xpath(".//a[contains(@href,'key=HONDA')]")).size() > 0) { 
       List<WebElement> col = row.findElements(By.tagName("td")); 
       tblData dummyThing = new tblData(); 
       dummyThing.col1 = col.get(0).getText(); 
       dummyThing.col2 = col.get(1).getText(); 
       dummyThing.col3 = col.get(2).getText(); 
       dummyThing.col4 = col.get(3).getText(); 
       dummyThings.add(dummyThing); 
      } 
     } 

私は無知だここ

page.find('#blah').all('tr').each { |row| 
    # if row matches xpath then grab that complete row 
    # so that other column values can be verified 
    # I am clueless from here 
    row.find('td').each do { |c| 

    } 
    page.find('#blah').all('tr').find(:xpath, ".//a[contains(@href,'key=HONDA')]").each { |r| 
    #we got the row that matches xpath, let us do something 
    } 
} 

答えて

11

私はあなたを考えますお探しですか?

page.all('#blah tr').each do |tr| 
    next unless tr.has_selector?('a[href*="HONDA"]') 

    # Do stuff with trs that meet the href requirement 
    puts tr.text 
end 
#=> link 29 33 485 45.2934,00 EUR 
#=> link 22 93 485 38.336.934,123 EUR 
trはHONDAを含むHREFを持っているリンクを持っていない場合は

  1. TRS
  2. のそれぞれを通るidを持つ要素内のすべてのTRS「何とか」
  3. 反復を探す:10

    これは、基本的には言います無視してください

  4. それ以外の場合は、条件の一致する行のテキストを出力してください。あなたはここでtrで必要なことをすることができます。

xpathを使用して、上記を1つのステートメントに縮小することもできます。しかし、私はそれが読み取り可能であるとは思わない:ここでは

page.all(:xpath, '//div[@id="blah"]//tr[.//a[contains(@href, "HONDA")]]').each do |tr| 
    # Do stuff with trs that meet the href requirement 
    puts tr.text 
end 
#=> link 29 33 485 45.2934,00 EUR 
#=> link 22 93 485 38.336.934,123 EUR 

は一致する各列のリンクURLと列の値を検査する方法の例です:

page.all('#blah tr').each do |tr| 
    next unless tr.has_selector?('a[href*="HONDA"]') 

    # Do stuff with trs that meet the href requirement 
    href = tr.find('a')['href'] 
    column_value_1 = tr.all('td')[1].text 
    column_value_2 = tr.all('td')[2].text 

    puts href, column_value_1, column_value_2 
end 
#=> file:///C:/Scripts/Misc/Programming/Capybara/afile?key=HONDA 
#=> 29 33 485 
#=> 45.2934,00 EUR 
#=> file:///C:/Scripts/Misc/Programming/Capybara/afile?key=HONDA 
#=> 22 93 485 
#=> 38.336.934,123 EUR 
+0

こんにちはコ、どのように私はHREFを得るのですかxpathにマッチするリンクの私は一致する行の列の値でいくつかの事をチェックする必要があります。だから、どのように一致する列(値)を取得するのですか? – Bala

+0

通常のファインダーを使ってtrを検査することができます。例が追加されました。 –

+0

セレンのエラー '要素がキャッシュに見つかりません - おそらく、ページが参照されてから変更されました。 'しかし、単に 'tr.text'を置いて' tr.has_selector?... 'を削除すれば動作します。 – Bala

関連する問題