发布新日志

  • Watir Web-Driver 的Browser对象

    2013-01-21 13:20:30

    Watir的browser对象

    Web-driver的大部分操作,都是将browser做为一个容器,然后去操作其当前页面所含的element。

    Browser对象是由如下方法创建:
    Browser = Watir::Browser.new:ff

    或者:

    Browser = Watir::Browser.start("www.baidu.com", browser=:ff)

    该对象的方法有:

    (Object) driver (等同于wd)

    返回该对象的driver属性值

    browser.driver
    => #(Selenium::WebDriver::Driver:0x324wef34 browser=:chrome)

    添加一个checker

    browser.add_checker do |page|
    page.text.include?("Server Error") and puts "Application exception or 500 error!"
    end


    操作JavaScript生成的alert,confirms和prompt窗口
    更多见: http://www.51testing.com/?uid-26810-action-viewspace-itemid-832516


    判断该browser的instance是否存在

    Browser.assert_exists
    => true

    (object) back

    返回上页,等同于点击browser的back键

    browser.back

    (object) browser

    返回对象的browser属性的值

    browser.browser
    => #<Watir::Browser:0x..fd324ds324c url ="about:blank" title="about:blank">

    (object) close (等同于quit)

    关闭当前的窗口/页面

    browser.close

    (Watir::Cookies) cookies

    处理当前页面的cookie
    更多见:http://www.51testing.com/?uid-26810-action-viewspace-itemid-832645

    (object) disable_checker(checker)

    关闭指定的checker

    browser.disable_checker(page)


    执行一个外部的JavaScript片段

    (Boolean) exist? (等同于exists?)

    判断页面是否被关闭

    browser.exist?
    => true


    页面向前进一步,等同于点击browser的forward按键

    browser.foward


    页面转向指定的URI地址

    browser.goto('www.google.com')



    返回当前页面的html内容

    browser.html


    返回当前页面的inspect属性的值

    browser.inspect
    => "#<Watir::Browser:0x..fdd3423c url=\"http://www.google.com.hk/\" title=\"Google\">


    返回表示browser就绪的标志内容

    browser.ready_state
    => "complete"



    刷新当前页面

    browser.refresh


    强行复原browser

    browser.reset!



    正在运行checker列表

    browser.run_checkers



    处理当前的页面的快照
    更多见:http://www.51testing.com/?uid-26810-action-viewspace-itemid-832647


    向页面当前focus的元素发送

    browser.send_keys('test')


    返回状态栏的内容

    browser.status


    返回页面body中的文本内容

    browser.text


    返回页面的title内容

    browser.title
    => "google"


    返回当前的url值

    browser.url
    => "http://www.google.com.hk/"



    页面在ready status出现前(complete),等待指定的秒数,默认5秒

    browser.wait(10)

    (window) window(*args, &blk)

    返回指定的browser所含的window

    browser.window(:title, 'Google')

    (Array(window)) windows(*arg)

    返回指定browser的window集合

    browser.windows(:title, 'Google')

    (object) wait_until(*arg, &blk)

    页面在条件满足前等待

    browser.wait_until(:title, 'Google')

    (object) wait_while(*arg, &blk)

    页面在条件满足时等待

    browser.wait_while(:title, 'Google')


  • Watir Web-Driver 的Anchor(link)对象

    2013-01-18 13:33:11

    Watir的Anchor是HTML Elment,其实就是,只不过a是其的缩写。

    在Watir中,使用Anchor,实际上以link作为操作对象的。 

    例如:在百度首页上,有一个link: hao123

    我们访问这个link:

    browser.link(:name, 'tj_hao123').class
    返回值为:=> Watir::AnchorAnchor

    对象的方法有如下:

    == 判断两个link是否相同

    browser.link(:name, 'tj_hao123') == browser.link(:text, 'hao123')
    =>true

    attribute_value 获得指定属性的值

    browser.link(:name, 'tj_hao123').attribute_value("href")
    => "http://www.hao123.com/"

    browser 所在browser的属性值

    browser.link(:name, 'tj_hao123').browser

    click 左键单击

    linkbrowser.link(:name, 'tj_hao123').click

    double_click 左键双击

    linkbrowser.link(:name, 'tj_hao123').double_click

    drag_and_drop_by 和 drag_and_drop_on 拖拽link到指定的位置/指定的元素上

    browser.link(:name, 'tj_hao123').drag_and_drop_by(100,-200)

    input1 =  browser.text_field(:name, 'test')
    browser.link(:name, 'tj_hao123').drag_and_drop_by(input1)

    driver 返回webdriver的driver信息

    browser.link(:name, 'tj_hao123').driver

    exists?/visible?/present? link是否存在/页面可见/存在+页面可见

    browser.link(:name, 'tj_hao123').exists?
    browser.link(:name, 'tj_hao123').visible?
    browser.link(:name, 'tj_hao123').present?

    fire_event 触发一个事件

    browser.link(:name, 'tj_hao123').fire_event('click') //等同于click方法

    flash 让link的背景闪烁几下,一般用来调试定位元素

    browser.link(:name, 'tj_hao123').flash

    focus 将焦点置于该link上 / focused? 是否焦点在该link上

    browser.link(:name, 'tj_hao123').focus
    browser.link(:name, 'tj_hao123').focused?
    => true

    hash 返回该link的哈希值

    browser.link(:name, 'tj_hao123').hash

    hover 将鼠标悬浮到该link上

    browser.link(:name, 'tj_hao123').hover

    html 返回该link的html编码

    browser.link(:name, 'tj_hao123').html

    initialize 创建一个新的link实例

    browser.link.initialize(paretn, selector)

    inspect 返回该link的信息

    browser.link(:name, 'tj_hao123').inspect

    parent 返回该link的父节点

    browser.link(:name, 'tj_hao123').parent


    right_click 右键点击该link

    browser.link(:name, 'tj_hao123').right_click

    run_checkers 该元素所涉及的checker列表,需要通过add_checker提前增加才能返回内容
    browser.link(:name, 'tj_hao123').run_checkers

    select_text 选择link中的指定文本(实际证明,该方法不存在)

    browser.link(:name, 'tj_hao123').select_text("123")

    send_keys 向该link元素发送键值

    browser.link(:name, 'tj_hao123').send_keys(:enter) //相当于敲回车键,等同于click

    style. 返回该link的style值

    browser.link(:name, 'tj_hao123').style

    tag_name 返回该link的tag

    browser.link(:name, 'tj_hao123').tag_name
    => "a"

    text 返回该link的text内容

    browser.link(:name, 'tj_hao123').text
    => "hao123"

    to_subtype 返回该link的subtype

    browser.link(:name, 'tj_hao123').to_subtype

    value 返回该link的value属性值

    browser.link(:name, 'tj_hao123').value
    => ""  //value 为空

    wait_until_present 在link出现前,最多等待多少秒 (超时,link没出现,报错)

    browser.link(:name, 'tj_hao123').wait_until_present

    wait_while_present 在link消失前,最多等待多少秒 (超时,link还在,报错)

    browser.link(:name, 'tj_hao123').wait_while_present

    when_present 等待多少秒,直到link出现(等同于wait_until_present)

    browser.link(:name, 'tj_hao123').when_present.click

    wd 返回link的webdriver id

    browser.link(:name, 'tj_hao123').wd
    =>#<Selenium::WebDriver::Element:0x123da83 id=":wdc:123234234">

  • Watir Web-Driver 的Alert 应用

    2013-01-17 15:56:14

    Watir Web-Driver已经不再依赖AutoIt就可以对Alert窗口进行操作。

    Alert的方法主要有:

    • close    关闭当前的alert/prompt弹窗。此方法相当于点击Cancel,Close等按键。
    • exists? 是否存在alert/prompt弹窗 (present?也可以用)。
    • ok       点击alert/prompt弹窗的OK button
    • set(value) 在prompt弹窗中输入内容
    • text     返回alert/prompt弹窗的内容值
    • wait_until_present 在弹窗出现前,最多等待多少秒 (超时,弹窗没出现,报错)
    • wait_while_present 在弹窗消失前,最多等待多少秒 (超时,弹窗还在,报错)*官方文档的注释是错误的
    • when_present       等待多少秒,直到弹窗出现(等同于wait_until_present)
    后三者的用法是:
    browser.alert.wait_until_present
    browser.alert.wait_while_present(10)
    browser.when_present

    我们看一个具体的实例:

    首先,我们创建一个alerttest.html文件,放到D盘根目录下,内容为:

    <html>
    <head>
    <SCRIPT. LANGUAGE="JAVASCRIPT">
    function button1onclick(){
        confirm("Confirm Mode")
    }
    function button2onclick(){
        alert("Alert Mode")
    }
    function button3onclick(){
        var name=prompt("Your name is:");
         document.write(name);
    }
    </SCRIPT>
    </head>
    <form>
    <input type="button" value="confirm mode" id ="button1" nclick="button1onclick()">
    <input type="button" value="alert mode"   id ="button2" nclick="button2onclick()">
    <input type="button" value="prompt mode"  id ="button3" nclick="button3onclick()">
    </form>
    </html>

    然后我们创建一个测试脚本test.rb

    #encoding:utf-8
    require 'watir-webdriver'
    require 'test/unit'   
     
    class MyTest < Test::Unit::TestCase

     def test

    $browser = Watir::Browser.new :chrome
    $browser.goto("d:\\alerttest.html")
    # confirm

    $browser.button(:id,'button1').click
    sleep(1)
    if $browser.alert.exists? then
    $browser.alert.ok # $browser.alert.close
    sleep(1)
    end
    # alert

    $browser.button(:id,'button2').click
    sleep(1)
    if $browser.alert.wait_until_present(3) then
    $browser.alert.ok # $browser.alert.close
    $browser.alert.wait_while_present(5)
    end

    # alert

    $browser.button(:id,'button3').click
    sleep(1)
    if $browser.alert.when_present then
    sleep(1)
    $browser.alert.set("test name")
    sleep(1)
    $browser.alert.ok # $browser.alert.close
    sleep(2)
    end

    end 
    end
     

  • 性能测试指标的含义(4)- Network

    2013-01-15 21:43:35

    Network Interface 计数器

    Bytes Total/sec
    是在每个网络适配器上发送和接收字节的速率,包括帧字符在内。是Bytes Received/sec Bytes Sent/sec的总和。

    Current Bandwidth
    指以位/每秒估计的网络接口的当前带宽。

    Output Queue Length
    为输出数据列队 (数据包) 的长度。如果这个长于 2,即会出现延缓并且如果可能的话找出并解决瓶颈问题。当输出使用网络驱动程序接口规格(NDIS) 列队,永远是0

    Packets/sec
    为在网络界面发送和接收数据包的速率。

    Packets Outbound Discarded
    指选定要丢弃的输出数据包的数目,即便没有发现会阻止传输这些数据包的错误。丢弃数据包的可能原因是释放缓冲空间。

    Packets Outbound Error
    为由于错误不能传输的输出数据包的数目。

    Packets Received Discarded
    指选定要丢弃的输入数据包的数目,即使没有发现阻碍这些数据包可传送到更高层协议的错误。造成丢弃数据包的可能原因是释放缓冲器空间。

    Packets Received Error
    指输入的错误数据包数目,这些数据包含阻碍它们可传送到更高层协议的错误。
    Packets Received/sec
    接收数据包的速率。

    Packets Sent/sec
    发送数据包的速率

  • 性能测试指标的含义(3)- Object,Memory 和 Disk

    2013-01-15 21:42:23

    Object 计数器

    Threads
    线程指在数据收集时在计算机中线程的数目。


    Memory 计数器

    Available Bytes
    是计算机上可用于运行处理的有效物理内存的字节数量。

    Cache Bytes
    是系统驻留缓存的总数。

    Pages/sec
    是指为解析硬页错误从磁盘读取或写入磁盘的页数。是 Memory - Pages Input/sec Memory -Pages Output/sec 的总和。

    Page Reads/sec
    是指为解析硬页错误而读取磁盘的次数。从磁盘上检索。

    Memory - Transition Faults/sec
    是指由在修改页列表、备份页表或在页错误时写入磁盘上造成的页错误数量。

    Pool Paged Bytes
    指在分页池中的字节数。分页池是系统的物理内存中可供对象(在不处于使用时可以写入磁盘的对象)使用的区域。

    Pool Nonpaged Bytes
    指在非分页池中的字节数。 非分页池是指系统的物理内存中可供对象(在不处于使用时不可以写入磁盘上的,必须保留在物理内存中的对象)使用的一个区域。


    Physical Disk 计数器

    %Disk Time
    指磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。

    % Idle Time
    指磁盘驱动器闲置时间的百分比。一般配合%Disk Time使用。

    Disk Reads/sec
    磁盘驱动器读取操作的速率。

    Disk Writes/sec
    磁盘驱动器写入操作的速率。

    Avg. Disk Queue Length
    指读取和写入请求列队的平均数。

    File Data Operations/sec
    指在计算机的所有逻辑磁盘上读取和写入操作的综合速度。这是系统的逆转率:每秒钟的文件控制操作

  • 性能测试指标的含义(2)- system 和 process

    2013-01-15 21:40:21

    System 计数器

    Processor Queue Length
    是指处理列队中的线程数。即使在有多个处理器 的计算机上处理器时间也会有一个单列队。如果处理器列队中总是有两个以上的线程,通常表示处理器堵塞。

    Context Switches/sec
    指计算机上的所有处理器全都从一个线程转换到另一个线程的综合速率


    Process 计数器

    Private Bytes
    指这个处理不能与其它处理共享的、已分配的当前字节数。

    Virtual Bytes
    指处理使用的虚拟地址空间的大小。虚拟空间是有限,如果使用过多,可能会限制处理加载数据库的能力。

    Working Set
    是在处理中被线程最近触到的那个内存页集的大小。

    Handle Count
    是在这个处理中每个线程当前打开的句柄的总数。

    Page Faults/sec
    指在这个进程中执行线程造成的页面错误出现的速度。当线程引用了不在主内存工作集中的虚拟内存页即会出现 Page Fault

    % User Time
    指处理线程用于执行使用用户模式的代码的时间的百分比。应用程序、环境分系统和集合分系统是以用户模式执行的。Windows 的可执行程序、内核和设备驱动程序不会被以用户模式执行的代码损坏。

    % Privileged Time

    是在特权模式下处理线程执行代码所花时间的百分比。当调用 Windows 系统服务时,此服务经常在特权模式运行,以便获取对系统专有数据的访问。在用户模式执行的线程无法访问这些数据。

    % Processor Time
    是所有进程线程使用处理器执行指令所花的时间百分比。指令是计算机执行的基础单位。线程是执行指令的对象,进程是程序运行时创建的对象。

    Page File Bytes
    指这个处理在 Paging file 中使用的最大字节数。Paging File 用于存储不包含在其他文件中的由处理使用的内存页。Paging File 由所有处理共享,并且 Paging File 空间不足会防止其他处理分配内存。

    I/O Data Bytes/sec
    处理从 I/O 操作读取/写入字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。

  • 性能测试指标的含义(1)- Processor计数器

    2013-01-15 21:39:09

    Processor计数

     

    %Processor Time
    指处理器执行非闲置线程时间的百分比。通常应该在80%以下(单核),超过80%表示CPU的处理能力已经达到极限。

    % Interrupt Time
    是处理器在实例间隔期间接受和服务硬件中断的时间的百分比。

    % User Time
    指处理器处于用户模式的时间百分比。用户模式是为应用程序所使用的环境。

    % Privileged Time
    在特权模式下处理线程执行代码所花时间的百分比。特权模式用于访问操作系统服务。

    % DPC Time
    指处理器用缓延程序调用 (DPC) 接收和提供服务的百分比。在多处理器系统中,如果这个值大于50%并且% Processor Time非常高,加入一个网卡可能会提高性能。

    Interrupts/sec
    指处理器每秒钟接收并维护的硬件中断的平均值。大多数的系统时钟每隔 10 毫秒中断处理器一次

  • 使用performance monitor 监控系统资源

    2013-01-15 18:48:02

    windows自带的performance monitor其实很强大,我们可以定制我们需要的监控目标,例如一个典型的用例:

    求一款可以设置时间自动记录系统资源使用情况的工具,如可以设置每个20s记录一次CPU和内存等资源使用情况,自动保存在一个文档

    其实很简单,下面一步步的进行操作:

    1.第一步,打开performance monitor。

    在XP环境下,路径是: Control Panel -》Administrative Tools -》 Performance

    2.选择要使用的log类型。

    按照上述要求,使用counter logs即可。

    点击Performance Logs and Alerts, 然后选择Counter Logs,然后点击右键,选择New Log Settings

    3. 配置log

    首先输入log的名称,比如:my logs,然后点击OK

    然后比如你要记录CPU和Memory的使用情况,可以点击Add Counters。

    选择要监控的电脑,然后从列表中选择Processor,然后选择%Processor Time,点击Add button。

    然后在列表中选择Memory,然后比如你要监控剩余了多少内存,通过总内存-剩余内存,就知道消耗的总内存数。 选择 Available MBytes。点击Add。 

    然后选择Close。

    4. 选择频率

    你可以看到有一个Memory和一个Processor的counter已经加好。

    选择下面的interval 20, Units seconds 意思是20秒记录一次。

    5.log文件的位置
    点击Log Files tab,你可以选择 文件的类型,比如 Text File(Tab delimited)

    点击config 可以设置log文件在那个目录下

    6. 设置运行

    点击Schedule 你可以选择这个log从什么时候开始执行。

    现在就可以用了。

    打开文件你可以看到:

    "(PDH-TSV 4.0) (China Standard Time)(-480)" "\\LAP\Memory\Available MBytes" "\\LAP\Processor(_Total)\% Processor Time"
    "01/15/2013 19:02:30.306" "1171" "99.999985898144317"
    "01/15/2013 19:02:50.295" "1163" "12.333386063062356"


  • Watir Web-Driver Element 的通用方法(3)

    2013-01-15 17:49:06

    - (Object) select_text(str)

    选择执行元素对象的指定文本。

    browser.area(:name, “first”).select_text(“Hello World!”)

     

    - (Object) send_keys(*args)

    对元素对象发送指定的键盘输入。

    browser.div(:id => "foo").send_keys ("Watir", :return)

     

    - (OString)Style(property = nil)

    返回对象的style属性内容。

    browser.a(:id => "foo").style
    #=> "display: block"
    browser.a(:id => "foo").style( "display")
    #=> "block"

     

    - (String) tag_name

    返回指定元素tag名称。

    browser.element(:id, “als”).tag_name
    #=> “div”

     

    - (String) text

    返回指定元素text内容。

    browser.element(:id, “als”).text
    #=> “Google.com”

     

     

     

     

    - (Object) to_subtype

    返回指定元素的详细类型信息。

    browser.element(:id, “als”).to_subtype
    #=> #<Watir::Div:0x4e234d2 located=false selector={:element=>(webdriver element)}>

     

    - (String) value

    返回指定元素value内容。

    browser.button(:name, “btnK”).value
    #=> “Google Search”

     

    - (Boolean) visible?

    指定元素是否在页面上可见。

    browser.button(:name, “btnK”).visible?
    #=> true

     

    注意:watir拥有三种方法Element#exists?, Element#visible?  Element#present?

    分别表示: 页面中存在 页面上可见 页面上存在且可见

     

    - (Object) wd

    指定元素的web driver信息。

    browser.button(:name, “btnK”).wd
    #=> #<Selenium::WebDriver::Element:0x619efdca id=”:wdc:1234324234”)

     

    - (Object) wait_until_present(timeout=30)

    等待指定元素的在页面上present,可以设置等待超时的时间,默认30秒。

    browser.button(:name, “btnK”).wait_until_present

     

     

    - (Object) wait_while_present(timeout=30)

    指定元素的在页面上present后,等待一定时间长度。可以设置等待超时的时间,默认30秒。

    browser.button(:name, “btnK”).wait_while_present

     

    - (Object) when_present(timeout=30)

    等待指定元素的在页面上present,可以设置等待超时的时间,默认30秒。

    browser.button(:name, “btnK”).when_present.click

     

    - (Object) downcase(value)

    返回指定元素value内容。

    browser.button(:name, “btnK”).value
    #=> “Google Search”
    browser.button(:name, “btnK”).downcase
    #=> “google search”

     

    - (Object) upcase(value)

    返回指定元素value内容。

    browser.button(:name, “btnK”).value
    #=> “Google Search”
    browser.button(:name, “btnK”).upcase
    #=> “GOOGLE SEARCH”

     

  • Watir Web-Driver Element 的通用方法(2)

    2013-01-15 17:48:24

    - (Object) flash

    修改的元素背景颜色,从而高亮该元素。

    browser.div(:id => "draggable").flash

     

    - (Object) focus

    focus置于指定的元素之上。

    browser.div(:id => "draggable").focus

     

    - (Object) focused?

    判断指定元素是否已经被focused。注意,不是所有元素都支持该方法,不支持的一律返回false

    browser.div(:id => "draggable").focused?

     

    - (Object) hash

    返回指定元素的哈希值

    browser.div(:id => "draggable").hash

     

    - (Object) hover

    将鼠标移至指定元素的中间位置。并非所有的浏览器都支持该操作。

    browser.div(:id => "draggable").hover

     

    - (String) html

    返回该元素所包含的HTML编码。

    browser.button(:name, “btnK”).html
    #=> “<input value =\”Google Search\” name=\”btnK\” type=\”submit\” jsaction=\”sf.chk\” >”

     

     

     

    - (Object) inspect

    返回指定元素对象的检查信息。

    browser.button(:name, “btnK”).inspect
    #=> “#<Watir::Button:0x..f8cf0d9 located =false selector={:name=>\”btnK\”, :tag_name=>\”button\”}>”

     

    - (Object) parent

    返回指定元素对象的父元素。

    browser.button(:name, “btnK”).parent
    #=> #<Watir::HTMLElement:0x16d0c6ce located=false selector={:element=>(webdriverelement)}>

     

    - (Boolean) present?

    指定元素是否在页面上存在并显示。

    browser.button(:name, “btnK”).present?
    #=> true

     

    - (Object) right_click

    右键点击指定元素。并非所有的浏览器都支持该方法。

    browser.button(:name, “btnK”).right_click

     

    - (Object) run_checkers

    返回指定元素对象的包含的checker列表

    Check_for_bad_things = Proc.new do
    puts “Server Error!” if @browser.text.include?(Server error”)
    end
     
    @browser.add_checker(Check_for_bad_things)
    @browser.run_checkers
    #=> [#<Proc:0x1053a50@(irb):69>]
  • Watir Web-Driver Element 的通用方法(1)

    2013-01-15 17:47:16

    - (Object) == (other) (also: #eql?)

    返回是否两个element是相同的。要注意的是是两个Object相同,不是相等。

    browser.a(:id => "foo") == browser.a(:id => "foo")

    #=> true

     

    - (String) attribute_value(attribute_name)

    返回元素的指定属性的值。

    browser.a(:id => "foo").attribute_value ("href")
    #=> "http://watir.com"  

     

    - (Watir::Browser) browser

    返回当前的browser

    browser.browser
    #=> #<Watir::Browser:0x..fa487467e url=”http://www.ggogle.com.hk/”  title=”Google”>

     

    - (Object) click(*modifiers)

    点击当前元素,同时可以提供可选值用于复杂的点击情况,例如Ctrl+click

    element.click
    element.click(:shift)
    element.click(:shift, :control)

    可支持的可选值有::shift, :alt, :control, :command, :meta

    - (Object) double_click

    双击当前元素。

    browser.a(:id => "foo").double_click

     

     

     

    - (Object) drag_and_drop_by(right_by, down_by)

    拖拽元素对象到指定的位置。位置指定为目标区域的右边线和下边线。

    browser.div(:id => "draggable").drag_and_drop_by (100, -200)

     

    - (Object) drag_and_drop_on(other)

    拖拽元素对象到指定的对象上。例如从左边列表拖拽一个选项到右边列表中。

    a = browser.div(:id => "draggable")
    b = browser.div(:id => "droppable")
    a.drag_and_drop_on(b)

     

    - (Object) driver

    元素对象的driver信息。

    browser.driver
    #=> #<Selenium::WebDriver::Driver:0x67382c7e browser=:chrome>

     

    - (Boolean) exists? (Also known as: exist?)

    判断元素对象是否存在。

    browser.a(:id => "foo") .exists?

    #=> true

     

    - (Object) fire_event(event_name)

    在指定的元素上执行一个JavaScript事件。

    browser.a(:id => "foo").fire_event(:click)
    browser.a(:id => "foo").fire_event("mousemove")
    browser.a(:id => "foo").fire_event "onmouseover"
  • 如何在 Watir 中识别各种 HTML 对象(7)

    2013-01-14 17:55:27

    Table元素

    HTML tag - <table>

     

    可以用来定位的方法有:

    Browser.table(:class,  “table class”)

    Browser.table(:id,  “table id”)

    Browser.table(:index,  0)

    Browser.table(:name,  “table name”)

    Browser.table(:text,  “table text”)

    Browser.table(:xpath,  “table xpath”)

    Browser.table(:class=>“table class name”,  :index, 0) (Mulitple Attributes)

     

    Text_field元素

    HTML tag - <input type=”password”>/<input type=”text”>

     

    可以用来定位的方法有:

    Browser.textfield(:class,  “textfield class”)

    Browser.textfield(:id,  “textfield id”)

    Browser.textfield(:index,  0)

    Browser.textfield(:name,  “textfield name”)

    Browser.textfield(:text,  “textfield text”)

    Browser.textfield(:value, “textfield value”)

    Browser.textfield(:xpath,  “textfield xpath”)

    Browser.textfield(:class=>“textfield class name”,  :index, 0) (Mulitple Attributes)

    Textarea元素

    HTML tag - <textarea>

     

    可以用来定位的方法有:

    Browser.textarea(:class,  “textarea class”)

    Browser.textarea(:id,  “textarea id”)

    Browser.textarea(:index,  0)

    Browser.textarea(:name,  “textarea name”)

    Browser.textarea(:text,  “textarea text”)

    Browser.textarea(:value, “textarea value”)

    Browser.textarea(:xpath,  “textarea xpath”)

    Browser.textarea(:class=>“textarea class name”,  :index, 0) (Mulitple Attributes)

     

    ul元素

    HTML tag - <ul>

     

    可以用来定位的方法有:

    Browser.ulist(:class,  “ulist class”)

    Browser.ulist(:id,  “ulist id”)

    Browser.ulist(:index,  0)

    Browser.ulist(:name,  “ulist name”)

    Browser.ulist(:text,  “ulist text”)

    Browser.ulist(:xpath,  “ulist xpath”)

    Browser.ulist(:class=>“ulist class name”,  :index, 0) (Mulitple Attributes)

     

    New Browser Windows 对象

    可以用来定位的方法有:

    Browser.window(:href,  “new window href”)

    Browser.window(:title,  “new window title”)

  • 如何在 Watir 中识别各种 HTML 对象(6)

    2013-01-14 17:54:40

    Radio元素

    HTML tag - <input type=”radio”>

     

    可以用来定位的方法有:

    Browser.radio(:class,  “radio class”)

    Browser.radio(:id,  “radio id”)

    Browser.radio(:index,  0)

    Browser.radio(:name,  “radio name”)

    Browser.radio(:text,  “radio text”)

    Browser.radio(:value, “radio value”)

    Browser.radio(:xpath,  “radio xpath”)

    Browser.radio(:class=>“radio class name”,  :index, 0) (Mulitple Attributes)

     

    Tr元素

    HTML tag - <tr>

     

    可以用来定位的方法有:

    Browser.tr(:class,  “tr class”)

    Browser.tr(:id,  “tr id”)

    Browser.tr(:index,  0)

    Browser.tr(:name,  “tr name”)

    Browser.tr(:text,  “tr text”)

    Browser.tr(:xpath,  “tr xpath”)

    Browser.tr(:class=>“tr class name”,  :index, 0) (Mulitple Attributes)

     

    Select_list元素

    HTML tag - <select>

     

    可以用来定位的方法有:

    Browser.select(:class,  “select class”)

    Browser.select(:id,  “select id”)

    Browser.select(:index,  0)

    Browser.select(:name,  “select name”)

    Browser.select(:text,  “select text”)

    Browser.select(:value, “select value”)

    Browser.select(:xpath,  “select xpath”)

    Browser.select(:class=>“select class name”,  :index, 0) (Mulitple Attributes)

    Span元素

    HTML tag - <span>

     

    可以用来定位的方法有:

    Browser.span(:class,  “span class”)

    Browser.span(:id,  “span id”)

    Browser.span(:index,  0)

    Browser.span(:name,  “span name”)

    Browser.span(:text,  “span text”)

    Browser.span(:xpath,  “span xpath”)

    Browser.span(:class=>“span class name”,  :index, 0) (Mulitple Attributes)

  • 如何在 Watir 中识别各种 HTML 对象(5)

    2013-01-14 17:51:04

    Link元素

    HTML tag - <link>

     

    可以用来定位的方法有:

    Browser.link(:after?, “after link”)

    Browser.link(:class,  “link class”)

    Brower.link(:href, “link href”

    Browser.link(:id,  “link id”)

    Browser.link(:index,  0)

    Browser.link(:name,  “link name”)

    Browser.link(:text,  “link text”)

    Browser.link(:xpath,  “link xpath”)

    Browser.link(:class=>“link class name”,  :index, 0) (Mulitple Attributes)

     

    Map元素

    HTML tag - <map>

     

    可以用来定位的方法有:

    Browser.map(:class,  “map class”)

    Browser.map(:id,  “map id”)

    Browser.map(:index,  0)

    Browser.map(:name,  “map name”)

    Browser.map(:text,  “map text”)

    Browser.map(:xpath,  “map xpath”)

    Browser.map(:class=>“map class name”,  :index, 0) (Mulitple Attributes)

     

    P元素

    HTML tag - <p>

     

    可以用来定位的方法有:

    Browser.paragraph(:class,  “paragraph class”)

    Browser.paragraph(:id,  “paragraph id”)

    Browser.paragraph(:index,  0)

    Browser.paragraph(:name,  “paragraph name”)

    Browser.paragraph(:text,  “paragraph text”)

    Browser.paragraph(:xpath,  “paragraph xpath”)

    Browser.paragraph(:class=>“paragraph class name”,  :index, 0) (Mulitple Attributes)

     

    Pre元素

    HTML tag - <pre>

     

    可以用来定位的方法有:

    Browser.pre(:class,  “pre class”)

    Browser.pre(:id,  “pre id”)

    Browser.pre(:index,  0)

    Browser.pre(:name,  “pre name”)

    Browser.pre(:text,  “pre text”)

    Browser.pre(:xpath,  “pre xpath”)

    Browser.pre(:class=>“pre class name”,  :index, 0) (Mulitple Attributes)

  • 如何在 Watir 中识别各种 HTML 对象(4)

    2013-01-14 17:49:50

    Head元素

    HTML tag - <h1><h2><h3><h4><h5><h6>

     

    可以用来定位的方法有:

    Browser.head(:class,  “heading class”)

    Browser.head(:id,  “head id”)

    Browser.head(:index,  0)

    Browser.head(:name,  “head name”)

    Browser.head(:text,  “head text”)

    Browser.head(:xpath,  “head xpath”)

    Browser.head(:class=>“head class name”,  :index, 0) (Mulitple Attributes)

     

    Hidden元素

    HTML tag - <hidden>

     

    可以用来定位的方法有:

    Browser.hidden(:class,  “hidden class”)

    Browser.hidden(:id,  “hidden id”)

    Browser.hidden(:index,  0)

    Browser.hidden(:method, “hidden method”)

    Browser.hidden(:name,  “hidden name”)

    Browser.hidden(:text,  “hidden text”)

    Browser.hidden(:value, “hidden value”)

    Browser.hidden(:xpath,  “hidden xpath”)

    Browser.hidden(:class=>“hidden class name”,  :index, 0)(Mulitple Attributes)

     

    Image元素

    HTML tag - <img>

     

    可以用来定位的方法有:

    Browser.image(:alt, “image alt”)

    Browser.image(:class,  “image class”)

    Browser.image(:for,”image for”)

    Browser.image(:id,  “image id”)

    Browser.image(:index,  0)

    Browser.image(:name,  “image name”)

    Browser.image(:src,”image src”)

    Browser.image(:text,  “image text”)

    Browser.hidden(:value, “hidden value”)

    Browser.hidden(:xpath,  “hidden xpath”)

    Browser.hidden(:class=>“hidden class name”,  :index, 0)(Mulitple Attributes)

    Label元素

    HTML tag - <label>

     

    可以用来定位的方法有:

    Browser.label(:class,  “label class”)

    Browser.label(:id,  “label id”)

    Browser.label(:index,  0)

    Browser.label(:name,  “label name”)

    Browser.label(:text,  “label text”)

    Browser.label(:xpath,  “label xpath”)

    Browser.label(:class=>“label class name”,  :index, 0) (Mulitple Attributes)

     

    Li元素

    HTML tag - <li>

     

    可以用来定位的方法有:

    Browser.li(:class,  “li class”)

    Browser.li(:id,  “li id”)

    Browser.li(:index,  0)

    Browser.li(:name,  “li name”)

    Browser.li(:text,  “li text”)

    Browser.li(:xpath,  “li xpath”)

    Browser.li(:class=>“li class name”,  :index, 0) (Mulitple Attributes)

     


  • 如何在 Watir 中识别各种 HTML 对象(3)

    2013-01-14 17:48:45

    Div元素

    HTML tag - <div>

     

    可以用来定位的方法有:

    Browser.div(:class,  “div class”)

    Browser.div(:id,  “div id”)

    Browser.div(:index,  0)

    Browser.div(:name,  “div name”)

    Browser.div(:text,  “div text”)

    Browser.checkbox(:xpath,  “div xpath”)

    Browser.checkbox(:class=>“div class name”,  :index, 0) (Mulitple Attributes)

     

    File_field元素

    HTML tag - <input type=”file”>

     

    可以用来定位的方法有:

    Browser.filefield(:class,  “file class”)

    Browser.filefield(:id,  “file id”)

    Browser.filefield(:index,  0)

    Browser.filefield(:name,  “file name”)

    Browser.filefield(:title,  “file title”)

    Browser.filefield(:value,  “file value”)

    Browser.filefield(:xpath,  “file xpath”)

    Browser.filefield(:class=>“file class name”,  :index, 0) (Mulitple Attributes)

     

    Form元素

    HTML tag - <form>

     

    可以用来定位的方法有:

    Browser.form(:action, “form. action”)

    Browser.form(:class,  “file class”)

    Browser.form(:id,  “form. id”)

    Browser.form(:index,  0)

    Browser.form(:method,  “form. method”)

    Browser.form(:name,  “form. name”)

    Browser.form(:xpath,  “form. xpath”)

    Browser.form(:class=>“form. class name”,  :index, 0) (Mulitple Attributes)

     

    Frame元素

    HTML tag - <frame>/<iframe>

     

    可以用来定位的方法有:

    Browser.frame(:id,  “frame. id”)/

    Browser.frame(:index,  0)

    Browser.frame(:name,  “frame. name”)

    Browser.frame(:src,  “frame. src”)

    Browser.frame(:text,  “frame. text”)

    Browser.frame(:id=>“frame. id”,  :index, 0) (Mulitple Attributes)

     


  • 如何在 Watir 中识别各种 HTML 对象(2)

    2013-01-14 17:47:48

    Area元素

    HTML tag - <area>

    可以用来定位的方法有:

    Browser.area(:class,  “area class name”)

    Browser.area(:id,  “area id”)

    Browser.area(:index, 0)

    Browser.area(:name, “area name”)

    Browser.area(:text, “area text”)

    Browser.area(:xpath, “area xpath”)

    Browser.area(:class=>“area class name”, :id=>“area id”, :index, 0) (Mulitple Attributes)

     

    Button元素

    HTML tag - <button>/<input type=”button”>/<input type=”image”>/<input type=”reset”>

    /<input type=”submit”>

     

    可以用来定位的方法有:

    Browser.button(:alt,  “alt button name”)

    Browser.button(:class,  “button class”)

    Browser.button(:id,  “button id”)

    Browser.button(:index,  0)

    Browser.button(:name,  “button name”)

    Browser.button(:src,  “image button src”) (only for type is image)

    Browser.button(:text,  “button text”)

    Browser.button(:value,  “button default value”)

    Browser.button(:xpath,  “button xpath”)

    Browser.button(:class=>“button class name”, :id=>“button id”, :index, 0) (Mulitple Attributes)

     

    Cell元素

    HTML tag - <td>

     

    可以用来定位的方法有:

    Browser.td(:alt,  “alt button name”)

    Browser.td(:class,  “td class”)

    Browser.td(:id,  “td id”)

    Browser.td(:index,  0)

    Browser.td(:name,  “td name”)

    Browser.td(:text,  “td text”)

    Browser.button(:xpath,  “td xpath”)

    Browser.button(:class=>“td class name”, :id=>“td id”, :index, 0) (Mulitple Attributes)

     

     

    Checkbox元素

    HTML tag - <input type=”checkbox”>

     

    可以用来定位的方法有:

    Browser.checkbox(:class,  “checkbox class”)

    Browser.checkbox(:id,  “checkbox id”)

    Browser.checkbox(:index,  0)

    Browser.checkbox(:name,  “checkbox name”)

    Browser.checkbox(:text,  “checkbox text”)

    Browser.checkbox(:value,  “checkbox value”)

    Browser.checkbox(:xpath,  “checkbox xpath”)

    Browser.checkbox(:class=>“checkbox class name”,  :index, 0) (Mulitple Attributes)

  • 如何在 Watir 中识别各种 HTML 对象(1)

    2013-01-14 17:43:29

    Watir Web-driver 支持的 HTML elements 如下所列:


  • Cucubmer 没有when

    2013-01-14 10:45:51

    呵呵,今天突然想试试看,如果没有when的cucubmer是不是还能跑的通。

    这是原始文件:

    # language: zh-CN
    功能:加法
      为了避免一些愚蠢的错误
      作为一个数学白痴
      我希望有人告诉我数字相加的结果

      场景: 两个数相加
        假如我已经在计算器里输入6
        而且我已经在计算器里输入7
        当我按相加按钮
        那么我应该在屏幕上看到的结果是13

      场景: 三个数相加
        假如我已经在计算器里输入6
        而且我已经在计算器里输入7
        而且我已经在计算器里输入1 
        当我按相加按钮
        那么我应该在屏幕上看到的结果是14

    相应的define step文件是:

    # encoding: utf-8
    begin require 'rspec/expectations'; rescue LoadError; require 'spec/expectations'; end
    require 'cucumber/formatter/unicode'
    $:.unshift(File.dirname(__FILE__) + '/../../lib') 
    require 'calculator'

    Before do
      @calc = Calculator.new
    end

    After do
    end

    Given /我已经在计算器里输入(\d+)/ do |n|
      @calc.push n.to_i
    end

    When /我按(.*)按钮/ do |op|
      if p == '相加'
        @result = @calc.send "add"
      end
    end

    Then /我应该在屏幕上看到的结果是(.*)/ do |result|
      @result.should == result.to_f
    end

    这是原始例子 可以正常跑通:

    2 scenarios (2 passed)
    9 steps (9 passed)
    0m0.016s



    这是没有when的文件:

    # language: zh-CN
    功能:加法
      为了避免一些愚蠢的错误
      作为一个数学白痴
      我希望有人告诉我数字相加的结果

      场景: 两个数相加
        假如我已经在计算器里输入6
        而且我已经在计算器里输入7
        而且我按相加按钮
        那么我应该在屏幕上看到的结果是13

      场景: 三个数相加
        假如我已经在计算器里输入6
        而且我已经在计算器里输入7
        而且我已经在计算器里输入1 
        而且我按相加按钮
        那么我应该在屏幕上看到的结果是14

    相应修改的step define文件是:

    # encoding: utf-8
    begin require 'rspec/expectations'; rescue LoadError; require 'spec/expectations'; end
    require 'cucumber/formatter/unicode'
    $:.unshift(File.dirname(__FILE__) + '/../../lib') 
    require 'calculator'

    Before do
      @calc = Calculator.new
    end

    After do
    end

    Given /我已经在计算器里输入(\d+)/ do |n|
      @calc.push n.to_i
    end

    Given /我按(.*)按钮/ do |op|
      if p == '相加'
        @result = @calc.send "add"
      end
    end

    Then /我应该在屏幕上看到的结果是(.*)/ do |result|
      @result.should == result.to_f
    end

    也可以正常跑通:

    2 scenarios (2 passed)
    9 steps (9 passed)
    0m0.016s


    其实为了更好的能够分隔Given和Then,还是加一个什么都不做的When比较好:
    # language: zh-CN
    功能:加法
      为了避免一些愚蠢的错误
      作为一个数学白痴
      我希望有人告诉我数字相加的结果

      场景: 两个数相加
        假如我已经在计算器里输入6
        而且我已经在计算器里输入7
        而且我按相加按钮
        当我开始验证结果
        那么我应该在屏幕上看到的结果是13

      场景: 三个数相加
        假如我已经在计算器里输入6
        而且我已经在计算器里输入7
        而且我已经在计算器里输入1 
        而且我按相加按钮
        当我开始验证结果
        那么我应该在屏幕上看到的结果是14

    相应的step define 文件是:

    # encoding: utf-8
    begin require 'rspec/expectations'; rescue LoadError; require 'spec/expectations'; end
    require 'cucumber/formatter/unicode'
    $:.unshift(File.dirname(__FILE__) + '/../../lib') 
    require 'calculator'

    Before do
      @calc = Calculator.new
    end

    After do
    end

    Given /我已经在计算器里输入(\d+)/ do |n|
      @calc.push n.to_i
    end

    Given /我按(.*)按钮/ do |op|
      if p == '相加'
        @result = @calc.send "add"
      end
    end

    When /我开始验证结果/ do ||
      puts '我开始验证结果'
    end

    Then /我应该在屏幕上看到的结果是(.*)/ do |result|
      @result.should == result.to_f
    end



    正常跑通:

    2 scenarios (2 passed)
    11 steps (11 passed)
    0m0.016s

    说明,cucumber是完全按照关键词+行去进行正则表达式的匹配的,各个步骤之间并没有逻辑关系,只是通过你的组织,实现了产品本身的业务逻辑。
  • Watir在cucumber上的应用

    2013-01-10 15:12:15

    接着昨天的table搞,那个table从上倒下一个value,id都没有,而且是动态的,偏偏还要像这样

    地图楼层修改 删除

    选择匹配行的链接进行操作。

    后来研究了半天发现element有个parent的方法,所以,简单了

    先匹配“地图楼层”这个td,然后返回该td的parent,即该行的tr,然后再index到该tr的第二个td,就可进行操作了:

    $browser.td(:text, '3333').parent.[](1).link(:text, '修改').click

    看来什么东西想精通,就得多用啊。

    然后根据cucumber的架构,搞了一些测试用例:

    在feature 文件中是这样的:

    # language: zh-CN
    功能:楼层管理
      作为一个管理人员
      我能够进行楼层管理

      场景: Case 1 - 验证界面元素(S2-ST-JBXXGL-LCGL-0001)
        假如进入基本信息管理界面
        当转入楼层管理界面
        那么我可以看到楼层编号
        并且我可以看到楼层名称
        并且我可以看到修改
        并且我可以看到删除
        并且我可以看到添加楼层
      
      场景: Case 2 - 正常添加楼层(S2-ST-JBXXGL-LCGL-0002)
        假如进入基本信息管理界面  
        而且我进入楼层管理界面    
        而且点击添加楼层          
        #而且我已经在楼层编号里输入001
        而且我已经在楼层名称里输入地下一层
        当点击添加楼层  
        那么我应该在楼层管理界面 
        #并且我可以看到001 
        并且我可以看到地下一层 

    然后再初期的define step中有这样的两行:

    Given /进入(.*)界面/ do |module_name|
      $autotest.navigate_to_module(module_name)
    end 

    When /进入(.*)界面/ do |module_name|
      $autotest.navigate_to_module(module_name)
    end 

    然后很和谐的就报错了,cucumber在匹配

    假如进入基本信息管理界面
    当进入楼层管理界面

    这两行的时候,神经错乱了,只好改成:

    假如进入基本信息管理界面
    当转入楼层管理界面


    Given /进入(.*)界面/ do |module_name|
      $autotest.navigate_to_module(module_name)
    end 

    When /转入(.*)界面/ do |module_name|
      $autotest.navigate_to_module(module_name)
    end 


    看来用中文写测试用例,也够费脑子的。

    经过一个模块的实验,发现435个手工测试用例,大概要定义45个step,然后需要定义56个functional

    不过,发现剩下的2000多个手工测试用例,需要新加的step应该不会超过20个 定义的功能也不会超过100个,就完成了所有的手工测试测试用例----》自动化测试用的转变

    哈哈 还是很厉害的,执行了20条case,大概一条在45秒, 就算一分钟, 2500个测试用里 差不多5个小时也能执行一遍,而手工测试用例,大概需要500个人/时


    所以,使用cucumber进行自动化测试,首先需要高质量的测试用例,然后还要进行挑选,没必要所有的测试用例都进行自动化。
1466/8<12345678>
Open Toolbar