如何根据行中的文本单击表中的链接

时间:2013-09-13 10:37:14

标签: ruby selenium-webdriver watir watir-webdriver page-object-gem

使用page-object和watir-webdriver如何根据下面的行文本单击表中的链接:

该表包含3行,第一列中有名称,右侧列中有相应的详细信息链接:

DASHBOARD ....详情

示例......详情

等等。

<div class="basicGridHeader">
    <table class="basicGridTable">ALL THE DETAILS: 
    ....soon
    </table>

</div>

<div class="basicGridWrapper">
    <table class="basicGridTable">
        <tbody id="bicFac9" class="ide043">
            <tr id="id056">
                <td class="bicRowFac10">
                    <span>
                        <label class="bicDeco5">
                            <b>DASHBOARD:</b> ---> Based on this text
                        </label>
                    </span>
                </td>

                <td class="bicRowFac11">
                    ....some element
                </td>

                <td class="bicRowFac12">
                    <span>
                        <a class="bicFacDet5">Details</a> ---> I should able click this link
                    </span>
                </td>
            </tr>
        </tbody>
    </table>
</div>

3 个答案:

答案 0 :(得分:4)

您可以找到包含指定文本的单元格,转到父行,然后在该行中找到详细信息链接。

假设您可能希望单击其他详细信息链接,我将定义一个view_details方法,该方法接受您要查找的行的文本:

class MyPage
  include PageObject

  table(:grid){ div_element(:class => 'basicGridWrapper')
    .table_element(:class => 'basicGridTable') }

  def view_details(label)
    grid_element.cell_element(:text => /#{label}/)
      .parent
      .link_element(:text => 'Details')
      .click
  end

end

然后,您可以点击以下链接:

page.view_details('DASHBOARD')

答案 1 :(得分:3)

表元素包括Enumerable模块,我觉得它在这些情况下非常有用。 http://ruby-doc.org/core-2.0.0/Enumerable.html。您可以使用find方法查找并返回与您要查找的条件匹配的行。例如:

class MyPage
  include PageObject

  table(:grid_table, :class => 'basicGridTable')

  def click_link_by_row_text(text_value)
    matched_row = locate_row_by_text(text_value)
    matched_row.link_element.click
    #if you want to make sure you click on the link under the 3rd column you can also do this...
    #matched_row[2].link_element.click
  end

  def locate_row_by_text(text_value)
    #find the row that matches the text you are looking for
    matched_row = grid_table_element.find { |row| row.text.include? text_value }
    fail "Could not locate the row with value #{text_value}" if matched_row.nil?
    matched_row
  end
end

这里,locate_row_by_text将查找包含您要查找的文本的行,如果找不到它将抛出异常。然后,一旦找到该行,您可以深入查看该链接,然后单击它,如click_link_by_row_text方法中所示。

答案 2 :(得分:0)

仅为后代,我想提供一个更新的答案。现在可以使用table_element[row_index][column_index]遍历表格。 更冗长一点:

  1. row_index也可能是要匹配的行中的文字 - 在您的情况下 - table_element['DASHBOARD']

  2. 然后使用索引(从零开始)或该列的标题找到相应的cell / td元素

  3.   

    table_element['DASHBOARD'][2] - 选择第三个元素   选定的行。

    由于您没有标题行(<th>元素),因此可以使用链接的class属性过滤单元格元素。像这样的东西

      

    table_element['DASHBOARD'].link_element(:class => 'bicRowFac10').click

    所以代码看起来像这样:

    class MyPage
      include PageObject
    
      def click_link_by_row_text(text_value)
        table_element[text_value].link_element(:class => 'bicRowFac10').click      
      end
    end

    如果您需要更多解释,请与我们联系。很乐意提供帮助:)