Table对象是自动化测试中经常需要处理的对象。由于webdriver中没有专门的table类,所以我们需要简单的封装出一个易用易扩展的Table类来帮助简化代码。
module EasyWrap class EasyWrapError < StandardError;end class NotValidElementError < EasyWrapError;end class IncorrectdIndexError < EasyWrapError;end class TableBase attr_reader :e def initialize e raise NotValidElementError unless e.is_a?(Selenium::WebDriver::Element) @e = e end def method_missing(m, *params, &blk) @e.send(m, *params) if @e.respond_to?(m) end end #TableBase class Table < TableBase def initialize e super(e) __rows end def __rows @rows = @e.find_elements(:css => 'tr') end private :__rows def rows all_rows = [] @rows.each { |r| rows << TableRow.new(r)} all_rows end def row_count @rows.size end def [](index) valid_index? index TableRow.new @rows[index] end def valid_index?(index) raise IncorrectdIndexError if index.to_i > row_count end end #Table class TableRow < TableBase def initialize e super(e) __cells end def __cells @cells = @e.find_elements(:tag_name => 'td') # 如果找不到td那么试着去找th @cells = @e.find_elements(:tag_name => 'th') if @cells.empty? end private :__cells def cells all_cells = [] @cells.each {|c| all_cells << TableCell.new(c)} end def cell_count @cells.size end def [](index) valid_index? index TableCell.new @cells[index] end def valid_index?(index) raise IncorrectdIndexError if index.to_i > cell_count end end #TableRow class TableCell < TableBase end #TableCell end #EasyWrap
EasyWrap定义了3个类
-
Table类,代表1个table对象,可以通过该对象来访问该table的行和列;
-
TableRow类 代表table的某1行,可以通过其访问table的某一列;
-
TableCell类 代表table的某1个单元格
假如我们需要点击table的第3行第1列,通过EasyWrap,我们可以这样来实现
talbe = EasyWrap::Table(dr.find_element(:id => 'table_id')) table[2][0].click
以下面的html代码为例:
<html> <head> <title>Table</title> <style> table {border: 1px solid #ccc} </style> </head> <body> <table id = "t"> <th>C1</th><th>C2</th><th>C3</th> <tr> <td>v1</td> <td>v2</td> <td>v3</td> </tr> <tr> <td>k1</td> <td>k2</td> <td>k3</td> </tr> </table> </body> </html>
接下来的脚本实现了高亮页面上table元素首行首列的功能
require 'rubygems' require 'selenium-webdriver' require './easy_wrap' include EasyWrap dr = Selenium::WebDriver.for :firefox table_file = 'file:///'+File.expand_path(File.join(File.dirname(__FILE__), 'table.html')) dr.get table_file t = dr.find_element(:id => 't') table = Table.new t p table.row_count highlight = <<JS arguments[0].style.border = "2px solid red" JS dr.execute_script highlight, table[0][0].e # 打印第2行第2列的值 puts table[1][1].text