Accessing a table within a table (Watir/PageObject

2019-08-01 15:06发布

I'm running Watir-webdriver with Cheezy's PageObject for Cucumber testing. I am new to ruby, testing, pageobjects, and watir.

I am trying to access a table. Specifically, I'm trying to click an image in the 7th column.

This is my code:

tables.downcase!
tables.gsub!(/\s+/, '_')
tables_elements = self.send("#{tables}s_elements")
the_table = tables_elements[table_number]
the_table[row_number][column_number].click

With this code running, it becomes apparent that it believes the table (columns, rows, everything) is one cell. After looking at the html, it appears there is another table within this one. The table is a gwt table of some sort. What this means is that the ID I have is not for the table I want, but for a table containing the table I want. Is there anyway to get what I want? For instance:

the_table[0].element[row_number][column_number]

Or do I have to manipulate the html directly? Because, sadly, there doesn't appear to be much to manipulate, and no way that I can see to set a class (multiple of these tables on every page) through the original java code. If you can think of another way to click the image, I'd be happy to hear it

Thank you in advance

1条回答
Summer. ? 凉城
2楼-- · 2019-08-01 15:45

Accessing table from table:

You can get the table within a table by chaining elements. Assuming that you want the first table within the table with an id, you can do:

your_table_element.table_element

For example, say the page html is:

<table id="known_id">
    <tr>
        <td>
            <table>
                <tr>
                    <td>A0</td>
                    <td>B0</td>
                </tr>
            </table>
        </td>
    </tr>
</table>

You can create a page object with a reference to the known table:

class MyPage
    include PageObject

    table(:your_table, :id => 'known_id')
end

The following would then give you the first row's second cell of the child table:

puts page.your_table_element.table_element[0][1].text
#=> "B0"

Note that you can pass additional locators to the table_element method. For example, if the child table is actually the second instead of the first table, you can do:

puts page.your_table_element.table_element(:index => 1)[0][1].text
#=> "B0"

Accessing child table directly:

Alternatively, assuming you always want the child table, you can change the page object to access it instead. This is done by pass a block to the accessor method:

class MyPage
    include PageObject

    table(:actual_table){ table_element(:id => 'known_id').table_element }
end

Which then means you do not need to call the extra table_element method:

puts page.actual_table_element[0][1].text
#=> "B0"
查看更多
登录 后发表回答