开源测试工具watir是采用的ruby语言进行开发的。在研究watir框架的时候,发现有一部分函数watir没有提供而且暂时没找到合适的gem包,而很多功能在我们原来的自动化测试框架中都通过c写的dll进行了实现,于是我们希望能够把这部分的dll无缝的移植到watir上,减少我们的工作量,而且可以更高效的实现我们需要的功能。
在ruby的开源项目中,Win32Api这个gem可以实现我们需要的功能。通过以下方法 ,我们就可以调用外部dll中的函数。
Win32Api.new(dllname, proc, import, export)
参数说明
dllname:dll文件的名字,如果想只写dll的名字,可以将dll放到system32目录或者当前目录下,或者写上dll文件所在的路径
proc: dll中函数的名字
import:函数传入参数的参数类型,其中 "p" 对应指针,"n","l"对应long,"i"对应int,"v" 对应void,如果有多个参数,可以通过 ["p","n"]数组的方式来实现,其中置为nil可以表示没有参数
export:函数的返回值类型,参数类型同上
Win32API#call([args ...])
调用dll中的函数,参数和返回值应该与new申明中的一致,如果返回一个指针,需要事前初始化,否则可能会有内存溢出问题。
例子:
有个dll的头文件的申明为:
extern ......
用ruby新建一个excel文件,并且设置一些值。
require 'win32ole'
excel = WIN32OLE.new("excel.application")
excel.Visible = true
excel.WorkBooks.Open("d:\\test.xls")
excel.WorkSheets("sheet1").Activate
excel.Cells(2,3).value = "张三"
excel.Cells(3,3).value = "王二"
excel.ActiveWorkbook.Close(0) // 0 不保存推出,1 保存退出
excel.Quit() ......
Ruby 101:对象和方法
Written by Allen Lee
从静态方法说起
在上一篇文章末尾,我们提到了受保护的静态方法……受保护的静态方法??Ruby的protected不是用来向相同类型的不同实例开放受限方法的访问的吗(忘记protected的用法了?不要紧,回去上一篇文章复习一下吧。),如果把它用于静态方法,那么我该向参数传入什么?
在回答这些问题之前,我们先来看看最简单的不带任何参数的静态方法,假设我有一个空的Class1类,如果我试图调用它的method1静态方法,那么我将会被告知没有这个方法:
图 1
在Ruby里,所有类最终都会继承自Object类(这个说法其实不够准确,但就目前而言,你大可放心这样理解),如果我试图调用它的method1静态方法,那么显然,我也将会被告知没有这个方法:
图 2
还记得Ruby允许我们重新打开并修改一个类吗,如果忘记了,不要紧,回去第一篇文章复习一下吧。下面,我们将会通过这种方式向Class类添加method1方法:
图 3
接着,我们再试一次Class1类及其基类的method1方法:
图 4
噢,买瓜!这到底是怎么一回事?
......
def delVss(path)
if File.directory?(path)
for f in d = Dir.open(path)
fpath = File.join(path, f)
if(f!="."&&f!="..")
if(f=~/\w+\.scc/||f=~/\w+\.vssscc/||f=~/\w+\.vspscc/)
print fpath," Has been delete","\n"
File.delete(fpath)
else
if File.directory?(fpath)
delVss fpath
end
& ......
require 'win32ole'
fns = Dir.glob("*.xls")
application = WIN32OLE.new("excel.application")
application.visible = TRUE
f = File.new('errorCauseEN.xml','w')
f.puts('<?xml version="1.0" encoding="utf-8"?>')
f.puts('<!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by et8 (et8) -->')
f.puts('<Category>')
fns.each do |file|
workbook = application.WorkBooks.Open(Dir.pwd + '/' + file)
sheet = workbook.WorkSheets(2)
sheet.Activate
i = 2
loop do
break if !sheet.Range('A'+ i.to_s).Value
break if !sheet.Range('C'+ i.to_s).Value
errname = sheet.Range('A'+ i.to_s).Value.to_s.hex.to_i.to_s.strip
valuename = sheet.Range('C'+ i.to_s).Value.strip
valuename.gsub!(/\"/,'\'')
f.puts(' '*4 + '<ErrorCode name="' + errname + '" value="' + valuename +'"/>')
......
两种不同的语言,不同的表达!
Python脚本实现.
""
"
File Name : clean.py
File Date : 2009/11/5 14:22:56
Author : DannyLai
Purpose : Clean the svn files
All svn projects have an hide directory "
.
svn"
The python script purpose is to clean the .svn directory in svn projects.
"
""
import
os
import
stat
SVNPROJECT_DIR =
"F:\\temp\\google-gdata"
def
findSVNDir(
path )
:
for
file in
os.
listdir(
path )
:
subpath =
os.
path.
join(
path,
file )
if
os.
path.
i ......
两种不同的语言,不同的表达!
Python脚本实现.
""
"
File Name : clean.py
File Date : 2009/11/5 14:22:56
Author : DannyLai
Purpose : Clean the svn files
All svn projects have an hide directory "
.
svn"
The python script purpose is to clean the .svn directory in svn projects.
"
""
import
os
import
stat
SVNPROJECT_DIR =
"F:\\temp\\google-gdata"
def
findSVNDir(
path )
:
for
file in
os.
listdir(
path )
:
subpath =
os.
path.
join(
path,
file )
if
os.
path.
i ......