Selenium-webdriver系列教程(13)————如何处理table_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > Selenium-webdriver系列教程(13)————如何处理table

Selenium-webdriver系列教程(13)————如何处理table

 2012/3/20 13:58:38  nbkhic  程序员俱乐部  我要评论(0)
  • 摘要:Table对象是自动化测试中经常需要处理的对象。由于webdriver中没有专门的table类,所以我们需要简单的封装出一个易用易扩展的Table类来帮助简化代码。moduleEasyWrapclassEasyWrapError<StandardError;endclassNotValidElementError<EasyWrapError;endclassIncorrectdIndexError<EasyWrapError
  • 标签:Web 何处 教程
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
发表评论
用户名: 匿名