I've done a lot of web scraping, where we have to deal with whatever 
HTML the developer hacked together.  Nested tables without id's or 
name's can be a pain, but they can be dealt with.  The methods may be 
different depending on which version of Watir you're running though.  
I'm using 1.5 from trunk here, and I recommend using one from trunk, 
even though they're not officially "released" yet.

In these cases, IRB is your best friend.  Here I've opened the browser 
to table1.html in the unittests\html directory.  I then start up IRB and 
connect to that browser:

C:\Documents and Settings\davids>irb
irb(main):001:0> require 'watir'
=> true
irb(main):002:0> include Watir
=> Object
irb(main):003:0> ie = IE.attach(:title, /Test/)
[...]

Next, we look to see what tables we have:

irb(main):008:0> ie.show_tables
Found 6 tables
1  id=      rows=2   columns=2
2  id=t1      rows=5   columns=1
3  id=t2      rows=2   columns=2
4  id=      rows=1   columns=2
5  id=body_test      rows=5   columns=1
6  id=pic_table      rows=1   columns=4
=> nil
irb(main):009:0>

Here we'll look for the nested table example.  Looks like table 3 
matches the nested table on the screen.  Note that table 4 is the table 
*inside* table 3!  We can confirm these guesses by showing the HTML for 
each table:

irb(main):010:0> ie.table(:index, 3).html
=> "\r\n<TABLE id=t2 border=1><TBODY>\r\n<TR>\r\n<TD>cell 1 
\r\n<TD>cell2 \r\n<T
R>\r\n<TD>\r\n<TABLE>\r\n<TBODY>\r\n<TR>\r\n<TD>nest1\r\n<TD>nest2</TR></TBODY><
/TABLE>\r\n<TD>Normal </TR></TBODY></TABLE>"
irb(main):011:0> ie.table(:index, 4).html
=> 
"\r\n<TABLE><TBODY>\r\n<TR>\r\n<TD>nest1\r\n<TD>nest2</TR></TBODY></TABLE>"
irb(main):012:0>

Sure enough, you can see table 4 there in the middle of table three.  
The reason this is important is because you can use indexes to find 
cells in a table:

irb(main):013:0> ie.table(:index, 3)[1][1].text
=> "cell 1"

The trick is that the embedded tables are counted as part of the 
containing table.  This is why the row_count for table 3 shows *3* rows 
instead of two:

irb(main):014:0> ie.table(:index, 3).row_count
=> 3

It's counting it's own two rows, plus the one row in the containing 
table.  Row 3 is the table 4's row 1, but though row_count reports 3 
rows, it won't let you ACCESS row 3, because it's really in table 4!

irb(main):016:0> ie.table(:index, 3)[2][1].text
=> "nest1nest2"
irb(main):017:0> ie.table(:index, 3)[2][1].html
=> 
"\r\n<TD><TABLE>\r\n<TBODY>\r\n<TR>\r\n<TD>nest1\r\n<TD>nest2</TR></TBODY></T
ABLE>"
irb(main):018:0> ie.table(:index, 4)[1][1].text
=> "nest1"
irb(main):019:0> ie.table(:index, 4)[1][2].text
=> "nest2"
irb(main):020:0> ie.table(:index, 3)[3][1].html
WIN32OLERuntimeError: Unknown property or method `2'
    HRESULT error code:0x80020006
      Unknown name.
        from 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.1.1077/./watir.rb:3193:in
`[]'
        from 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.1.1077/./watir.rb:3193:in
`row'
        from 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.1.1077/./watir.rb:3140:in
`[]'
        from (irb):20
irb(main):021:0> ie.table(:index, 3)[3][1].text
WIN32OLERuntimeError: Unknown property or method `2'
    HRESULT error code:0x80020006
      Unknown name.
        from 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.1.1077/./watir.rb:3193:in
`[]'
        from 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.1.1077/./watir.rb:3193:in
`row'
        from 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.1.1077/./watir.rb:3140:in
`[]'
        from (irb):21
irb(main):022:0>

That last row must be accessed via table 4.

There have been some discussions about fixing this inconsistency and 
I've argued towards accuracy where row_count would only report the rows 
in it's OWN table, and sub-tables would be accessed for their row count, 
but others have been afraid of breaking existing tests which already 
account for the inaccurate count.

Hope this helps you address the cells in your nested table situation.

David Schmidt

Vincent Predoehl wrote:
> I'm writing scripts to test a web site I didn't write myself.  This 
> web site has nested tables … not all of them have names … noobs.
>
> How do you access nested tables in watir?  I've tried everything and 
> am at my wit's end.  I'm about ready to just grep the source code for 
> the links, but I'd rather not do that.
>
> -- 
> Vincent
_______________________________________________
Wtr-general mailing list
Wtr-general@rubyforge.org
http://rubyforge.org/mailman/listinfo/wtr-general

Reply via email to