zoukankan      html  css  js  c++  java
  • Seleniumwebdriver系列教程(13)————如何处理table

    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
    
  • 相关阅读:
    记录使用cx_Freeze打包Python成exe可执行程序
    jquery plug-in DataTable API中文文档参考
    java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx/lib/arm/liblame.so: has text relocations
    CocoaPods的安装及使用
    Android 贝塞尔曲线的浅析
    GUI学习中错误Exception in thread "main" java.lang.NullPointerException
    线程
    12月13日
    今天开始学习java编程
    UVA10140 Prime Distance
  • 原文地址:https://www.cnblogs.com/nbkhic/p/2227028.html
Copyright © 2011-2022 走看看