How to get a HTML table row with Capybara

Viewed 17204

I am trying to scan rows in a HTML table using partial href xpath and perform further tests with that row's other column values.

  <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>

In cucumber-jvm step definition, I performed this much easily like below (I am more comfortable using Ruby)

@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);
            }
        }

I am clueless here

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
  }
}
2 Answers

If you need the table row, you could probably use something like the ancestor method:

anchors = page.all('#blah a[href*="HONDA"]')
trs = anchors.map { |anchor| anchor.ancestor('tr') }
Related