参考:

http://wiki.openqa.org/display/WTR/Watir+demo+on+Mercury+Tours

require 'test/unit'

require 'watir'

require 'watir/screen_capture'

class Demo < Test::Unit::TestCase

include Watir

include Watir::ScreenCapture

def setup

@ie = Watir::IE.new_process

@ie.goto("http://newtours.demoaut.com/")

end

def test_logon

@ie = Watir::IE.attach(:url,"http://newtours.demoaut.com/" )

@ie.maximize()

assert_equal(@ie.title, "Welcome: Mercury Tours")

@ie.text_field(:name, "userName").set "test"

@ie.text_field(:name, "password").set "test"

@ie.button(:name,"login").click

screen_capture("logon.jpg",true)

assert_equal(@ie.title, "Find a Flight: Mercury Tours:")

assert(@ie.radio(:name,"tripType", "oneway").exists?)

assert(@ie.select_list(:name,"passCount").exists?)

assert(@ie.select_list(:name,"fromPort").exists?)

assert(@ie.select_list(:name,"fromMonth").exists?)

assert(@ie.select_list(:name,"fromDay").exists?)

assert(@ie.select_list(:name,"toPort").exists?)

assert(@ie.radio(:name, "servClass","Business").exists?)

assert(@ie.select_list(:name,"airline").exists?)

assert(@ie.form(:name, "findflight").exists?)

# booking page 1

@ie.radio(:name,"tripType", "oneway").set

@ie.select_list(:name,"passCount").select "1"

@ie.select_list(:name,"fromPort").select "Acapulco"

@ie.select_list(:name,"fromMonth").select "March"

@ie.select_list(:name,"fromDay").select "10"

@ie.select_list(:name,"toPort").select "Frankfurt"

@ie.radio(:name, "servClass","Business").set

@ie.select_list(:name,"airline").select "Unified Airlines"

@ie.form(:name, "findflight").submit

screen_capture("page1.jpg",true)

# booking page 2

assert(@ie.radio(:name, "outFlight","Blue Skies Airlines$360$270$5:03").exists?)

assert(@ie.radio(:name, "outFlight","Blue Skies Airlines$361$271$7:10").exists?)

assert(@ie.radio(:name, "outFlight","Pangea Airlines$362$274$9:17").exists?)

assert(@ie.radio(:name, "outFlight","Unified Airlines$363$281$11:24").exists?)

@ie.radio(:name, "outFlight","Pangea Airlines$362$274$9:17").set

assert(@ie.radio(:name, "inFlight","Blue Skies Airlines$631$273$14:30").exists?)

@ie.radio(:name, "inFlight","Blue Skies Airlines$631$273$14:30").set

assert(@ie.form(:name,"results").exists?)

@ie.form(:name,"results").submit

screen_capture("page2.jpg",true)

#booking page 3  -- purchase

assert(@ie.text_field(:name,"passFirst0").exists?)

assert(@ie.text_field(:name,"passLast0").exists?)

assert(@ie.text_field(:name,"creditnumber").exists?)

assert(@ie.form(:name,"bookflight").exists?)

@ie.text_field(:name,"passFirst0").set "samuel"

@ie.text_field(:name,"passLast0").set "luo"

@ie.text_field(:name,"creditnumber").set "1234"

@ie.form(:name,"bookflight").submit

screen_capture("page3.jpg",true)

end

def teardown

@ie.close()

end

end

这个例子测试QTP的WEB样例程序,使用了screen_capture包来实现屏幕截取,打开这个包(C:/ruby/lib/ruby/gems/1.8/gems/watir-1.5.2/watir/screen_capture.rb)可以看到,所谓的屏幕截取就是使用Win32API进行硬拷贝,然后打开画图程序保存成文件:

require 'Win32API'

module Watir

module ScreenCapture

KEYEVENTF_KEYUP = 0x2

SW_HIDE         = 0

SW_SHOW         = 5

SW_SHOWNORMAL   = 1

VK_CONTROL      = 0x11

VK_F4           = 0x73

VK_MENU         = 0x12

VK_RETURN       = 0x0D

VK_SHIFT        = 0x10

VK_SNAPSHOT     = 0x2C

VK_TAB      = 0x09

GMEM_MOVEABLE = 0x0002

CF_TEXT = 1

# this method saves the current window or whole screen as either a bitmap or a jpeg

# It uses paint to save the file, so will barf if a duplicate filename is selected, or  the path doesnt exist etc

#    * filename        - string  -  the name of the file to save. If its not fully qualified the current directory is used

#    * active_window   - boolean - if true, the whole screen is captured, if false,  just the active window is captured

#    * save_as_bmp     - boolean - if true saves the file as a bitmap, saves it as a jpeg otherwise

def screen_capture(filename , active_window_only=false, save_as_bmp=false)

keybd_event = Win32API.new("user32", "keybd_event", ['I','I','L','L'], 'V')

vkKeyScan = Win32API.new("user32", "VkKeyScan", ['I'], 'I')

winExec = Win32API.new("kernel32", "WinExec", ['P','L'], 'L')

openClipboard = Win32API.new('user32', 'OpenClipboard', ['L'], 'I')

setClipboardData = Win32API.new('user32', 'SetClipboardData', ['I', 'I'], 'I')

closeClipboard = Win32API.new('user32', 'CloseClipboard', [], 'I')

globalAlloc = Win32API.new('kernel32', 'GlobalAlloc', ['I', 'I'], 'I')

globalLock = Win32API.new('kernel32', 'GlobalLock', ['I'], 'I')

globalUnlock = Win32API.new('kernel32', 'GlobalUnlock', ['I'], 'I')

memcpy = Win32API.new('msvcrt', 'memcpy', ['I', 'P', 'I'], 'I')

filename = Dir.getwd.tr('/','//') + '//' + filename unless filename.index('//')

if active_window_only ==false

keybd_event.Call(VK_SNAPSHOT,0,0,0)   # Print Screen

else

keybd_event.Call(VK_SNAPSHOT,1,0,0)   # Alt+Print Screen

end

winExec.Call('mspaint.exe', SW_SHOW)

sleep(1)

# Ctrl + V  : Paste

keybd_event.Call(VK_CONTROL, 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?V), 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?V), 1, KEYEVENTF_KEYUP, 0)

keybd_event.Call(VK_CONTROL, 1, KEYEVENTF_KEYUP, 0)

# Alt F + A : Save As

keybd_event.Call(VK_MENU, 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?F), 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?F), 1, KEYEVENTF_KEYUP, 0)

keybd_event.Call(VK_MENU, 1, KEYEVENTF_KEYUP, 0)

keybd_event.Call(vkKeyScan.Call(?A), 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?A), 1, KEYEVENTF_KEYUP, 0)

sleep(1)

# copy filename to clipboard

hmem = globalAlloc.Call(GMEM_MOVEABLE, filename.length+1)

mem = globalLock.Call(hmem)

memcpy.Call(mem, filename, filename.length+1)

globalUnlock.Call(hmem)

openClipboard.Call(0)

setClipboardData.Call(CF_TEXT, hmem)

closeClipboard.Call

sleep(1)

# Ctrl + V  : Paste

keybd_event.Call(VK_CONTROL, 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?V), 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?V), 1, KEYEVENTF_KEYUP, 0)

keybd_event.Call(VK_CONTROL, 1, KEYEVENTF_KEYUP, 0)

if save_as_bmp == false

# goto the combo box

keybd_event.Call(VK_TAB, 1, 0, 0)

keybd_event.Call(VK_TAB, 1, KEYEVENTF_KEYUP, 0)

sleep(0.5)

# select the first entry with J

keybd_event.Call(vkKeyScan.Call(?J), 1, 0, 0)

keybd_event.Call(vkKeyScan.Call(?J), 1, KEYEVENTF_KEYUP, 0)

sleep(0.5)

end

# Enter key

keybd_event.Call(VK_RETURN, 1, 0, 0)

keybd_event.Call(VK_RETURN, 1, KEYEVENTF_KEYUP, 0)

sleep(1)

# Alt + F4 : Exit

keybd_event.Call(VK_MENU, 1, 0, 0)

keybd_event.Call(VK_F4, 1, 0, 0)

keybd_event.Call(VK_F4, 1, KEYEVENTF_KEYUP, 0)

keybd_event.Call(VK_MENU, 1, KEYEVENTF_KEYUP, 0)

sleep(1)

end

end

end

#screenCapture( "f.bmp", false , true)

用Watir测试QTP的Demo程序Mercury Tours相关推荐

  1. qtp启动java程序_转: QTP六脉神剑之调用Java程序

    查看( 1147 ) / 评论( 21 ) 六脉神剑之调用程 序0Xp1zLN_0版权声明:原创作品,转载请以链接方式注明出自http://www.51testing.com/?35,否则将追究法律责 ...

  2. Android中通过USB接口与和PC进行通讯的demo程序

    以往开发过多款安卓嵌入式设备,这些设备与PC通讯主要通过设备上的以太网网口进行网络通讯,最近一个项目设备没有以太网网口,设备与PC通讯要求使用普通安卓数据线连接设备与PC完成数据通讯. 查阅相关资料以 ...

  3. 新浪微博开发平台基于php的sdk包(包含demo程序),新浪微博API开发教程(一)-体验篇...

    现在新浪微博开放平台(http://open.weibo.com)非常火啊,所以...,你懂的! 首先,想要开发新浪微博API,你就必须获取APP KEY和APP SECRET,我毫不犹豫的就用新浪微 ...

  4. Skia4Dephi 的 Demo 程序界面架构分析

    前言 Skia 是一个高效率的 2D 画图引擎,由 Google 开源出来.目前可以运行在 Android, iOS 和 Win32 上面. Skia4Delphi 是一个开源的 Delphi 控件, ...

  5. qtp启动java程序_QTP六脉神剑之调用Java程序

    版权声明:原创作品,转载请以链接方式注明出自,否则将追究法律责任.本文出自songfun的51Testing软件博客:不少网友对于QTP调用Java程序感到束手无策,实际上要调用Java程序是非常容易 ...

  6. Android API Demo程序框架

    前言 android API Demo程序主要演示了Android常见API的使用方法, 本文将该程序的框架提取出来, 以作为自己研究和学习Android编程的一个示例收集框架,即将所有自己研究过的例 ...

  7. ADO.NET Entity Framework 入门示例向导(附Demo程序下载)

    ADO.NET Entity Framework 入门示例向导(附Demo程序下载) ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架, ...

  8. .QT-制作最强电压电阻表盘,可以自定义阴影效果,渐变颜色,图标,文字标签等-附带demo程序

    .QT-制作最强电压电阻表盘,可以自定义阴影效果,渐变颜色,图标,文字标签等-附带demo程序 qt自定义控件-圆形通用指示表盘

  9. 使用sikuli和Arquillian测试HTML5 canvas应用程序

    HTML5引入了一个很棒的新元素,可以用来在窗格上绘制任意内容: canvas元素. 数十年来,胖客户端应用程序的标准功能现已引入Web应用程序领域. Web开发人员不再需要使用专有插件在其应用程序中 ...

  10. 测试无服务器应用程序的最佳方法

    Serverless is more than a cloud computing execution model. It changes the way we plan, build, and de ...

最新文章

  1. svn由于连接方在一段时间后没有正确答复或连接的主机没有反应连接尝试失败...
  2. 数据库系统的三级模式结构知识笔记
  3. java多个文件压缩_java实现多个文件压缩
  4. java中枚举表示数据状态
  5. QT中如何固定窗口的大小?
  6. hdu 1818 It's not a Bug, It's a Feature!(位运算+bfs优先队列)
  7. Mysql密码加密方式
  8. 【渝粤教育】电大中专电子商务网站建设与维护 (3)作业 题库
  9. linux 操作系统级别监控 free命令
  10. 2021华为软挑-成渝复赛复盘
  11. 软件工程:可行性研究
  12. 打开eclipse翻译错误值13 的解决办法
  13. 如何修改图片大小?图片怎么调整尺寸?
  14. JWT解析及安全问题
  15. 转----一个图形爱好者的书架.-也来介绍一下我的藏书.
  16. Spring的Tomcat服务关闭后,Quartz进程无法正常关闭,出现内存泄露
  17. 基于粒子群算法的组卷系统的研究与实现
  18. 算法分析学习笔记二 蛮力法
  19. OpenStack T版服务组件--Keyston身份服务
  20. 系统运维架构 DevOps

热门文章

  1. mysql rrd_时间序列数据库rrd启动
  2. Linux操作系统管理-Resource temporarily unavailable
  3. 使用AJAX 和php数组两种方式获取LOL英雄信息
  4. OSChina 周三乱弹 ——人生四人行,一男两女是夫妻,还有一个单身狗
  5. 2014互联网十大斗殴事件,看了我也是醉了~
  6. huobi程序化交易项目
  7. 17行python代码轻松搞定堆糖网所有小姐姐图片
  8. 江南时报:百度有啊命名堪比可口可乐
  9. kotlin-android-extensions过时了,迁移到ViewBinding
  10. word中公式和文字不在一行的设置方法