5 votes

Watir Webdriver : Itération d'un tableau et stockage de son contenu dans un tableau

J'essaie d'automatiser un bloc apparaissant sur le site web et de comparer son contenu à travers la table du CMS. Le problème est que j'ai réussi à automatiser le bloc apparaissant sur l'interface utilisateur mais lorsque je me connecte en tant qu'administrateur et que j'essaie d'enregistrer le contenu de la table dans un tableau en utilisant l'itération, je n'y parviens pas.

<table id="nodequeue-dragdrop" class="nodequeue-dragdrop sticky-enabled tabledrag-processed sticky-table">
<thead class="tableHeader-processed">
<tbody>
  <tr class="draggable odd">
    <td>
      <a class="tabledrag-handle" href="#" title="Drag to re-order">
      <a href="stackoverflow.com/car-news/moscow/new-text-1">New Text 1</a>
    </td>
    <td>
    <td>2012-06-06 10:24</td>
    <td style="display: none;">
    <td>
    <td>
    <td class="position">1</td>
  </tr>
  <tr class="draggable even">
    <td>
      <a class="tabledrag-handle" href="#" title="Drag to re-order">
      <a href="stackoverflow.com/car-news/new-cars/text-2">Text 2 </a>
    </td>
    <td>
    <td>2012-06-06 10:29</td>
    <td style="display: none;">
    <td>
    <td>
    <td class="position">2</td>
  </tr>
  <tr class="draggable odd">
    <td>
      <a class="tabledrag-handle" href="#" title="Drag to re-order">
      <a href="stackoverflow.com/car-news/new-cars/this-is-text-3">This is Text 3</a>
    </td>
    <td>
    <td>2012-06-05 12:55</td>
    <td style="display: none;">
    <td>
    <td>
    <td class="position">3</td>
  </tr>

Le code que j'utilise est le suivant

@text = Array.new
  x = 1
  y = 0

  until x == 10
    y = x -1

   until y == x
    @text[y] = @browser.table(:id,'nodequeue-dragdrop').tbody.row{x}.cell{1}.link(:href =>/car-news/).text

    puts @text[y]
    y=y+1  
   end

  x=x+1
 end

Le problème est que le scripts s'exécute avec succès mais bien que j'aie défini une itération, le scripts ne lit que le 1er élément et affiche son texte et ne passe pas au 2ème, 3ème...et ainsi de suite.

6voto

Justin Ko Points 40040

Il existe des méthodes intégrées pour itérer sur les lignes/colonnes. Essayez ceci :

table_array = Array.new
table = @browser.table(:id,'nodequeue-dragdrop')
table.rows.each do |row|
    row_array = Array.new
    row.cells.each do |cell|
        row_array << cell.text
    end
    table_array << row_array
end
puts table_array  # This will be an array (row) of arrays (column)

6voto

Chuck van der Linden Points 4665

Justin va dans la bonne direction en utilisant les méthodes intégrées de Ruby pour itérer sur des collections. Si je lis bien votre code, vous savez que vous recherchez le texte de liens spécifiques, alors pourquoi itérer sur les lignes alors que vous pourriez simplement créer une collection de liens correspondants ?

link_text_array = Array.new
@browser.table(:id,'nodequeue-dragdrop').links(:href => /car-news/) do |link|
  link_text_array << link.text
end

0voto

NewTester Points 281

J'ai trouvé la solution à mon problème

au lieu de rows{}, j'ai utilisé tds{} c'est-à-dire que j'ai modifié le code en

@text[y] = @browser.table(:id,'nodequeue-dragdrop').tbody.tds{x}.cell{1}.link(:href =>/car-news/).text

Il fonctionne comme je le souhaite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X