2013-12-11 15 views
5

Próbuję skanować wiersze w tabeli HTML przy użyciu częściowej ścieżki href i wykonywać dalsze testy z wartościami innych kolumn tego wiersza.Jak uzyskać wiersz tabeli HTML przy użyciu Capybara

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

W definicji kroku ogórek-JVM, Wykonałem to dużo łatwo jak poniżej (jestem bardziej wygodne przy użyciu 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); 
      } 
     } 

Jestem pojęcia tutaj

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

Odpowiedz

11

Chyba zamierzają zrobić:

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 

To w zasadzie mówi:

  1. Znajdź wszystkie TRS w elemencie z id „bla”
  2. iterację każdego z TRS
  3. Jeśli tr nie ma linku, który ma href zawierający HONDA , zignoruj ​​to
  4. W przeciwnym razie wypisz tekst wiersza (który odpowiada kryteriom). Możesz zrobić to, czego potrzebujesz, tutaj, tutaj.

Można również użyć xpath, aby zwinąć powyższe w pojedynczą instrukcję. Jednak nie sądzę, że jest czytelny:

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 

Oto przykład, w jaki sposób sprawdzić link URL i kolumn wartości każdego Dopasowany Row:

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

Hi Ko, jak mogę uzyskać href łącza, które dopasowuje xpath. Muszę sprawdzić kilka rzeczy za pomocą wartości kolumn zgodnego rzędu. Jak mogę uzyskać te pasujące kolumny (wartości)? – Bala

+0

Możesz użyć zwykłych celowników do sprawdzenia tr. Dodano przykład. –

+0

Otrzymuję komunikat Selenium "Element nie został znaleziony w pamięci podręcznej - być może strona zmieniła się od czasu, gdy została sprawdzona ...". Ale działa, jeśli po prostu 'puts tr.text' usuwa' tr.has_selector? ... '. – Bala