watir学习系列--对话框处理
一直有朋友问如何使用watir处理对话框的问题
在网上搜了下相关的帖子,讲的都不是很详细,最近抽时间研究了下
watir是调用autoit处理对话框的
下面是个人编写的类库,保存为libAutoit.rb
窗口处理类库libAutoit.rb
#LibAutoit主要处理windows弹出的对话框,调用autoit类进行处理
#函数如下:
#- ChooseFileDialog函数:处理选择文件对话框窗口
#- clearSecurityAlert函数:处理安全警告对话框
#- ControlSetText函数:给对话框中的某个控件设置值
#- ControlClick函数:向指定控件发送鼠标点击命令
#- ControlGetText函数:获取指定控件值
#- ControlGetHandle函数:获取指定控件值的句柄
#- ControlFocus函数:设置输入焦点到指定窗口的某个控件上
#- DealDownloadDialog函数:处理文件下载对话框
#- DealPathDialog函数:设置下载文件路径及操作下载,如果文件已存在则覆盖处理
#- DealAlterDialog函数:处理Alter对话框
#- DealConfirmDialog函数:处理Confirm对话框
#- DealPromptDialog函数:处理Prompt对话框
#- DealSecurity函数:点击页面链接,使弹出安全警告对话框
#- GetDialogTitle函数:根据类型获取弹出的窗口标题
#- SendKey函数:模拟键盘输入字符
#- WinExists函数:判断窗口是否存在
module LibAutoit
class AutoItApi
def initialize
require 'win32ole'
require 'watir/windowhelper'
WindowHelper.check_autoit_installed
@autoit = WIN32OLE.new("AutoItX3.Control")
@DealDownloadDialogTimeOut = 40
@DealPathDialogTimeOut = 40
@ChooseFileDialogTimeOut = 40
@DealAlterDialogTimeOut = 40
@DealConfirmDialogTimeOut = 40
@DealPromptDialogTimeOut = 40
@DealSecurityTimeOut = 40
@clearSecurityAlertTimeOut = 40
end #def initialize end
#功能说明:根据类型获取弹出的窗口标题,因为IE各版本弹出的对话框标题有差异,需要进行特殊处理
#
#参数说明:
#type:窗口类型,具体值如下:
#- type=1:选择文件窗口标题
#- type=2:Alter窗口标题
#- type=3:Prompt窗口标题
#- type=4:安全警告窗口标题
#- type=5:文件下载窗口标题
#- type=6:文件另存为窗口标题
#
#调用示例: GetDialogTitle(2)
#
#返回值说明:
#- 成功:返回获取的标题
#- 失败:返回false
def GetDialogTitle(type = 2)
#$logger.log("调用函数:LibAutoit.rb文件中的GetDialogTitle(#{type})" )
case type
when 1 #选择文件窗口标题
dialog_title = ['选择文件','Choose file']
when 2 #Alter窗口标题
dialog_title = ['Microsoft Internet Explorer','Windows Internet Explorer']
when 3 #Prompt窗口标题
dialog_title = ['Explorer 用户提示','Explorer User Prompt']
when 4 #安全警告窗口标题
dialog_title = ['安全警告','Security Alert']
when 5 #文件下载窗口标题
dialog_title = ['文件下载 - 安全警告','文件下载','File Download']
when 6 #文件另存为窗口标题
dialog_title = ['另存为']
end
dialog_title.each do |title|
if (WinExists(title,'') == 1)
$logger.log("获取的窗口:#{title}",'N')
$logger.log("调用函数结束:LibAutoit.rb文件中的GetDialogTitle(#{type})" ,'N')
return title
end
end
return false
#$logger.log("调用函数结束:LibAutoit.rb文件中的GetDialogTitle(#{type})" )
end
#功能说明:处理文件下载对话框,调用DealPathDialog函数设置路径及下载文件
#
#参数说明:
#- file_path:文件下载后存放的路径,格式如:c:\\test
#- file_name:文件名,如:test.txt
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealDownloadDialog(“c:\\test\test.txt”,15)
#
#返回值说明:
#- 成功:返回ture
#- 失败:返回false
def DealDownloadDialog(file_path,file_name,timeout = @DealDownloadDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealDownloadDialog(#{file_path},#{file_name},#{timeout})",'N' )
$logger.log('----------deal with download File dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(5) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
sleep(1)
ControlClick(win_title,'','Button2')
DealPathDialog(file_path,file_name)
$logger.log('----------deal with download File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealDownloadDialog(),返回结果:true",'N' )
return true
end
else
$logger.log("Deal Download File Dialog Fail!")
$logger.log('----------deal with download File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealDownloadDialog(),返回结果:false",'N' )
return false
end
end
end
#功能说明:设置下载文件路径及操作下载,如果文件已存在则覆盖处理
#
#参数说明:
#- file_path:文件下载后存放的路径,格式如:c:\\test
#- file_name:文件名,如:test.txt
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例:
#- DealPathDialog(“c:\\test”,"test.txt")
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def DealPathDialog(file_path,file_name = '',timeout = @DealPathDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealPathDialog(#{file_path},#{file_name},#{timeout})",'N' )
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(6) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
#if (file_name == '')
#file_name = ControlGetText(win_title,'','Edit1')
#end
if (!FileTest::exist?(file_path))
FileUtils.makedirs(file_path)
end
file_full_path = "#{file_path}\\#{file_name}"
real_file_path = $TxtClass.GetRealPath(file_full_path,'N')
real_full_path = "#{real_file_path}\\#{file_name}"
ControlSetText(win_title,'','Edit1',real_full_path)
SendKey("!S")
#ControlClick(win_title,'','Button2')
if (WinExists(win_title,'替换') == 1)
@autoit.WinActivate(win_title,'替换')
ControlClick(win_title,'替换','Button1')
end
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPathDialog()" ,'N')
return true
end
else
$logger.log("Deal File Path Dialog Fail!")
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPathDialog()" ,'N')
return false
end
end
end
#功能说明:处理选择文件对话框窗口
#
#参数说明:无
#- file_path:文件下载后存放的路径,格式:目录+文件名,如:c:\\test\\test.txt
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: ChooseFileDialog(“c:\\test\\test.txt”,15)
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def ChooseFileDialog(file_path,timeout = @ChooseFileDialogTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})" ,'N')
$logger.log('----------deal with Choose File dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(1) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
if (FileTest::exist?(file_path))
real_file_path = $TxtClass.GetRealPath(file_path) #获取真实路径
ControlSetText(win_title,'','Edit1',real_file_path)
ControlClick(win_title,'','Button2')
$logger.log('----------deal with Choose File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})",'N' )
return true
else
$logger.log('----------deal with Choose File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})",'N' )
return false
end
end
else
$logger.log("Deal Choose File Dialog Fail!")
$logger.log('----------deal with Choose File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})" ,'N')
return false
end
end
end
#功能说明:处理Alter对话框
#
#参数说明:
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealAlterDialog(15)
#
#返回值说明:
#- 成功:返回对话框中的文本提示内容
#- 失败:返回false
def DealAlterDialog(timeout = @DealAlterDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealAlterDialog(#{timeout})" ,'N')
$logger.log('----------deal with alter dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(2) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
alter_content = ControlGetText(win_title,'','Static2')
SendKey('{ENTER}')
#ControlClick('Windows Internet Explorer','','Button1')
#puts "alter message:\n #{alter_content}"
$logger.log("the content of alter dialog: #{alter_content} ",'N')
$logger.log('-----------deal with alter dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealAlterDialog(#{timeout})" ,'N')
return alter_content
end
else
$logger.log("deal with alter dialog fail!")
$logger.log('-----------deal with alter dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealAlterDialog(#{timeout})" ,'N')
return false
end
end
end
#功能说明:处理Confirm对话框
#
#参数说明:
#- type:点击确定或取消按钮,Y:确定 N:取消
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealConfirmDialog()
#
#返回值说明:
#- 成功:返回对话框中的文本提示内容
#- 失败:返回false
def DealConfirmDialog(type = 'Y',timeout = @DealConfirmDialogTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的DealConfirmDialog()" ,'N')
$logger.log('----------deal with confirm dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(2) #获取窗口标题'
if (win_title)
@autoit.WinActivate(win_title,'')
confirm_content = ControlGetText(win_title,'','Static2')
case type
when 'Y'
ControlClick(win_title,'','Button1')
when 'N'
ControlClick(win_title,'','Button2')
end
$logger.log("the content of confirm dialog: #{confirm_content} ",'N')
$logger.log('-----------deal with confirm dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealConfirmDialog()" ,'N')
return confirm_content
#puts "窗口提示信息:#{confirm_content}"
end
else
$logger.log("deal with confirm dialog fail!")
$logger.log('-----------deal with confirm dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealConfirmDialog()" ,'N')
return false
end
end
end
#功能说明:处理Prompt对话框
#
#参数说明:
#- string:输入的文本内容
#- type:点击确定或取消按钮,Y:确定 N:取消
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealPromptDialog('test','Y',15)
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def DealPromptDialog(string = '',type = 'Y',timeout = @DealPromptDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealPromptDialog(#{string},#{type},#{timeout})" ,'N')
puts '----------deal with prompt dialog begin----------'
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(3) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
ControlSetText(win_title,'','Edit1',string)
case type
when 'Y'
ControlClick(win_title,'','Button1')
when 'N'
ControlClick(win_title,'','Button2')
end
$logger.log('-----------deal with prompt dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPromptDialog(#{string},#{type},#{timeout})" ,'N')
return true
end
else
$logger.log("deal with prompt dialog fail!")
$logger.log('-----------deal with prompt dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPromptDialog(#{string},#{type},#{timeout})" ,'N')
return false
end
end
end
#功能说明:点击页面链接,使弹出安全警告对话框
#
#参数说明:
#- win_title:IE页面的标题
#- timeout:对话框处理的超时时间
#
#调用示例: DealSecurity("ie标题",15)
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def DealSecurity(win_title,timeout = @DealSecurityTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的DealSecurity(#{win_title},#{timeout})" ,'N')
start_time = Time.now.to_i
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
while 1
@autoit.ControlClick(win_title,'','Button1')
sleep(1)
SendKey('{DOWN}')
SendKey('{ENTER}')
sleep(1)
clearSecurityAlert('Y') #清除安全框窗口
return true
end
else
$logger.log('Deal Security Fail!')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealSecurity(#{win_title},#{timeout})" ,'N')
return false
end
end
#功能说明:处理安全警告对话框
#
#参数说明:
#- type:选择点击哪个按钮,Y:确定 N:取消
#- timeout:对话框处理的超时时间
#
#调用示例: DealSecurity("ie标题",15)
#
#返回值说明:
#- 成功:返回安全警告窗口中的提示信息
#- 失败:返回false
def clearSecurityAlert(type = 'Y',timeout = @clearSecurityAlertTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的clearSecurityAlert(#{type},#{timeout})" ,'N')
$logger.log('----------deal with Security dialog begin----------')
#处理安全对话框
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(4) #获取窗口标题
if (win_title)
alter_content = ControlGetText(win_title,'','Static2')
case type
when 'Y'
ControlClick(win_title,'','Button1')
when 'N'
ControlClick(win_title,'','Button2')
end
#puts "安全警告信息:\n#{alter_content}"
$logger.log("the content of Security dialog: #{alter_content} ")
$logger.log('-----------deal with Security dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的clearSecurityAlert(#{type},#{timeout})" ,'N')
return alter_content
end
else
$logger.log("The Security Alert Windows is not exist!")
$logger.log('-----------deal with Security dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的clearSecurityAlert(#{type},#{timeout})",'N' )
return false
end
end
end
#功能说明:模拟键盘输入字符
#
#参数说明:
#- string:输入的字符串信息,
#- timeout:对话框处理的超时时间
#
#调用示例:
#- Send("#r") 将发送 Win+r,这将打开“运行”对话框.
#- Send("^!a") 发送按键 "CTRL+ALT+a".
#- Send(" !a") 按下"ALT+a".
#
#返回值说明:无
def SendKey(string = '{ENTER}')
@autoit.Send(string)
end
#功能说明:给对话框中的某个控件设置值
#
#参数说明:
#- win_title:对话框窗口的标题
#- win_text:对话框窗口中显示的文本
#- id:对话框窗口中某个控件的ID
#- string:控件设置的值
#
#调用示例: 无
#
#返回值说明:无
def ControlSetText(win_title,win_text,id,string = '',flag = 1)
#修改指定控件的文本
@autoit.WinActivate(win_title,win_text)
if (ControlFocus(win_title,win_text,id) == 1)
@autoit.ControlSetText(win_title,win_text,id,string)
end
end
#功能说明:向指定控件发送鼠标点击命令
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#- button_type:按键 [可选参数] 要点击的按钮, 可以是"left", "right", "middle", "main", "menu", "primary", "secondary". 默认为left(左键).
#- click_time :要点击鼠标按钮的次数. 默认值为 1.
#
#调用示例: 无
#
#返回值说明:无
def ControlClick(win_title,win_text,id,button_type =1,click_time = 1)
@autoit.AutoItSetOption("WinTitleMatchMode", 3)
@autoit.WinActivate(win_title,win_text)
case button_type
when 1 #点击鼠标左键
button_type = 'left'
when 2 #点击鼠标右键
button_type = 'right'
when 3 #点击鼠标中间键
button_type = 'middle'
end
@autoit.ControlClick(win_title,win_text,id,button_type,click_time)
end
#功能说明:获取指定控件值
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#
#调用示例: 无
#
#返回值说明:
#- 返回获取的文本内容
def ControlGetText(win_title,win_text,id)
if (ControlGetHandle(win_title,win_text,id) != "")
control_text = @autoit.ControlGetText(win_title,win_text,id)
return control_text
end
end
#功能说明:获取指定控件值的句柄
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#
#调用示例: 无
#
#返回值说明:
#- 返回获取的控件句柄
def ControlGetHandle(win_title,win_text,id)
ret = @autoit.ControlGetHandle(win_title,win_text,id)
return ret
end
#功能说明:设置输入焦点到指定窗口的某个控件上
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#
#调用示例: 无
#
#返回值说明:无
def ControlFocus(win_title,win_text,id)
#设置输入焦点到指定窗口的某个控件上
ret = @autoit.ControlFocus(win_title,win_text,id)
return ret
end
#功能说明:判断窗口是否存在
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本,默认为空
#
#调用示例: 无
#
#返回值说明:返回窗口对象
def WinExists(win_title,win_text = '')
#检查指定的窗口是否存在
ret = @autoit.WinExists(win_title,win_text = '')
return ret
end
end
end
#LibAutoit主要处理windows弹出的对话框,调用autoit类进行处理
#函数如下:
#- ChooseFileDialog函数:处理选择文件对话框窗口
#- clearSecurityAlert函数:处理安全警告对话框
#- ControlSetText函数:给对话框中的某个控件设置值
#- ControlClick函数:向指定控件发送鼠标点击命令
#- ControlGetText函数:获取指定控件值
#- ControlGetHandle函数:获取指定控件值的句柄
#- ControlFocus函数:设置输入焦点到指定窗口的某个控件上
#- DealDownloadDialog函数:处理文件下载对话框
#- DealPathDialog函数:设置下载文件路径及操作下载,如果文件已存在则覆盖处理
#- DealAlterDialog函数:处理Alter对话框
#- DealConfirmDialog函数:处理Confirm对话框
#- DealPromptDialog函数:处理Prompt对话框
#- DealSecurity函数:点击页面链接,使弹出安全警告对话框
#- GetDialogTitle函数:根据类型获取弹出的窗口标题
#- SendKey函数:模拟键盘输入字符
#- WinExists函数:判断窗口是否存在
module LibAutoit
class AutoItApi
def initialize
require 'win32ole'
require 'watir/windowhelper'
WindowHelper.check_autoit_installed
@autoit = WIN32OLE.new("AutoItX3.Control")
@DealDownloadDialogTimeOut = 40
@DealPathDialogTimeOut = 40
@ChooseFileDialogTimeOut = 40
@DealAlterDialogTimeOut = 40
@DealConfirmDialogTimeOut = 40
@DealPromptDialogTimeOut = 40
@DealSecurityTimeOut = 40
@clearSecurityAlertTimeOut = 40
end #def initialize end
#功能说明:根据类型获取弹出的窗口标题,因为IE各版本弹出的对话框标题有差异,需要进行特殊处理
#
#参数说明:
#type:窗口类型,具体值如下:
#- type=1:选择文件窗口标题
#- type=2:Alter窗口标题
#- type=3:Prompt窗口标题
#- type=4:安全警告窗口标题
#- type=5:文件下载窗口标题
#- type=6:文件另存为窗口标题
#
#调用示例: GetDialogTitle(2)
#
#返回值说明:
#- 成功:返回获取的标题
#- 失败:返回false
def GetDialogTitle(type = 2)
#$logger.log("调用函数:LibAutoit.rb文件中的GetDialogTitle(#{type})" )
case type
when 1 #选择文件窗口标题
dialog_title = ['选择文件','Choose file']
when 2 #Alter窗口标题
dialog_title = ['Microsoft Internet Explorer','Windows Internet Explorer']
when 3 #Prompt窗口标题
dialog_title = ['Explorer 用户提示','Explorer User Prompt']
when 4 #安全警告窗口标题
dialog_title = ['安全警告','Security Alert']
when 5 #文件下载窗口标题
dialog_title = ['文件下载 - 安全警告','文件下载','File Download']
when 6 #文件另存为窗口标题
dialog_title = ['另存为']
end
dialog_title.each do |title|
if (WinExists(title,'') == 1)
$logger.log("获取的窗口:#{title}",'N')
$logger.log("调用函数结束:LibAutoit.rb文件中的GetDialogTitle(#{type})" ,'N')
return title
end
end
return false
#$logger.log("调用函数结束:LibAutoit.rb文件中的GetDialogTitle(#{type})" )
end
#功能说明:处理文件下载对话框,调用DealPathDialog函数设置路径及下载文件
#
#参数说明:
#- file_path:文件下载后存放的路径,格式如:c:\\test
#- file_name:文件名,如:test.txt
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealDownloadDialog(“c:\\test\test.txt”,15)
#
#返回值说明:
#- 成功:返回ture
#- 失败:返回false
def DealDownloadDialog(file_path,file_name,timeout = @DealDownloadDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealDownloadDialog(#{file_path},#{file_name},#{timeout})",'N' )
$logger.log('----------deal with download File dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(5) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
sleep(1)
ControlClick(win_title,'','Button2')
DealPathDialog(file_path,file_name)
$logger.log('----------deal with download File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealDownloadDialog(),返回结果:true",'N' )
return true
end
else
$logger.log("Deal Download File Dialog Fail!")
$logger.log('----------deal with download File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealDownloadDialog(),返回结果:false",'N' )
return false
end
end
end
#功能说明:设置下载文件路径及操作下载,如果文件已存在则覆盖处理
#
#参数说明:
#- file_path:文件下载后存放的路径,格式如:c:\\test
#- file_name:文件名,如:test.txt
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例:
#- DealPathDialog(“c:\\test”,"test.txt")
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def DealPathDialog(file_path,file_name = '',timeout = @DealPathDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealPathDialog(#{file_path},#{file_name},#{timeout})",'N' )
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(6) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
#if (file_name == '')
#file_name = ControlGetText(win_title,'','Edit1')
#end
if (!FileTest::exist?(file_path))
FileUtils.makedirs(file_path)
end
file_full_path = "#{file_path}\\#{file_name}"
real_file_path = $TxtClass.GetRealPath(file_full_path,'N')
real_full_path = "#{real_file_path}\\#{file_name}"
ControlSetText(win_title,'','Edit1',real_full_path)
SendKey("!S")
#ControlClick(win_title,'','Button2')
if (WinExists(win_title,'替换') == 1)
@autoit.WinActivate(win_title,'替换')
ControlClick(win_title,'替换','Button1')
end
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPathDialog()" ,'N')
return true
end
else
$logger.log("Deal File Path Dialog Fail!")
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPathDialog()" ,'N')
return false
end
end
end
#功能说明:处理选择文件对话框窗口
#
#参数说明:无
#- file_path:文件下载后存放的路径,格式:目录+文件名,如:c:\\test\\test.txt
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: ChooseFileDialog(“c:\\test\\test.txt”,15)
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def ChooseFileDialog(file_path,timeout = @ChooseFileDialogTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})" ,'N')
$logger.log('----------deal with Choose File dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(1) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
if (FileTest::exist?(file_path))
real_file_path = $TxtClass.GetRealPath(file_path) #获取真实路径
ControlSetText(win_title,'','Edit1',real_file_path)
ControlClick(win_title,'','Button2')
$logger.log('----------deal with Choose File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})",'N' )
return true
else
$logger.log('----------deal with Choose File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})",'N' )
return false
end
end
else
$logger.log("Deal Choose File Dialog Fail!")
$logger.log('----------deal with Choose File dialog end----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的ChooseFileDialog(#{file_path},#{timeout})" ,'N')
return false
end
end
end
#功能说明:处理Alter对话框
#
#参数说明:
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealAlterDialog(15)
#
#返回值说明:
#- 成功:返回对话框中的文本提示内容
#- 失败:返回false
def DealAlterDialog(timeout = @DealAlterDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealAlterDialog(#{timeout})" ,'N')
$logger.log('----------deal with alter dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(2) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
alter_content = ControlGetText(win_title,'','Static2')
SendKey('{ENTER}')
#ControlClick('Windows Internet Explorer','','Button1')
#puts "alter message:\n #{alter_content}"
$logger.log("the content of alter dialog: #{alter_content} ",'N')
$logger.log('-----------deal with alter dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealAlterDialog(#{timeout})" ,'N')
return alter_content
end
else
$logger.log("deal with alter dialog fail!")
$logger.log('-----------deal with alter dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealAlterDialog(#{timeout})" ,'N')
return false
end
end
end
#功能说明:处理Confirm对话框
#
#参数说明:
#- type:点击确定或取消按钮,Y:确定 N:取消
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealConfirmDialog()
#
#返回值说明:
#- 成功:返回对话框中的文本提示内容
#- 失败:返回false
def DealConfirmDialog(type = 'Y',timeout = @DealConfirmDialogTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的DealConfirmDialog()" ,'N')
$logger.log('----------deal with confirm dialog begin----------')
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(2) #获取窗口标题'
if (win_title)
@autoit.WinActivate(win_title,'')
confirm_content = ControlGetText(win_title,'','Static2')
case type
when 'Y'
ControlClick(win_title,'','Button1')
when 'N'
ControlClick(win_title,'','Button2')
end
$logger.log("the content of confirm dialog: #{confirm_content} ",'N')
$logger.log('-----------deal with confirm dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealConfirmDialog()" ,'N')
return confirm_content
#puts "窗口提示信息:#{confirm_content}"
end
else
$logger.log("deal with confirm dialog fail!")
$logger.log('-----------deal with confirm dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealConfirmDialog()" ,'N')
return false
end
end
end
#功能说明:处理Prompt对话框
#
#参数说明:
#- string:输入的文本内容
#- type:点击确定或取消按钮,Y:确定 N:取消
#- timeout:对话框处理的超时时间,默认为20秒
#
#调用示例: DealPromptDialog('test','Y',15)
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def DealPromptDialog(string = '',type = 'Y',timeout = @DealPromptDialogTimeOut )
$logger.log("调用函数:LibAutoit.rb文件中的DealPromptDialog(#{string},#{type},#{timeout})" ,'N')
puts '----------deal with prompt dialog begin----------'
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(3) #获取窗口标题
if (win_title)
@autoit.WinActivate(win_title,'')
ControlSetText(win_title,'','Edit1',string)
case type
when 'Y'
ControlClick(win_title,'','Button1')
when 'N'
ControlClick(win_title,'','Button2')
end
$logger.log('-----------deal with prompt dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPromptDialog(#{string},#{type},#{timeout})" ,'N')
return true
end
else
$logger.log("deal with prompt dialog fail!")
$logger.log('-----------deal with prompt dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealPromptDialog(#{string},#{type},#{timeout})" ,'N')
return false
end
end
end
#功能说明:点击页面链接,使弹出安全警告对话框
#
#参数说明:
#- win_title:IE页面的标题
#- timeout:对话框处理的超时时间
#
#调用示例: DealSecurity("ie标题",15)
#
#返回值说明:
#- 成功:返回true
#- 失败:返回false
def DealSecurity(win_title,timeout = @DealSecurityTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的DealSecurity(#{win_title},#{timeout})" ,'N')
start_time = Time.now.to_i
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
while 1
@autoit.ControlClick(win_title,'','Button1')
sleep(1)
SendKey('{DOWN}')
SendKey('{ENTER}')
sleep(1)
clearSecurityAlert('Y') #清除安全框窗口
return true
end
else
$logger.log('Deal Security Fail!')
$logger.log("调用函数结束:LibAutoit.rb文件中的DealSecurity(#{win_title},#{timeout})" ,'N')
return false
end
end
#功能说明:处理安全警告对话框
#
#参数说明:
#- type:选择点击哪个按钮,Y:确定 N:取消
#- timeout:对话框处理的超时时间
#
#调用示例: DealSecurity("ie标题",15)
#
#返回值说明:
#- 成功:返回安全警告窗口中的提示信息
#- 失败:返回false
def clearSecurityAlert(type = 'Y',timeout = @clearSecurityAlertTimeOut)
$logger.log("调用函数:LibAutoit.rb文件中的clearSecurityAlert(#{type},#{timeout})" ,'N')
$logger.log('----------deal with Security dialog begin----------')
#处理安全对话框
start_time = Time.now.to_i
while 1
if (Time.now.to_i-start_time < timeout) #判断处理时间是否超时
win_title = GetDialogTitle(4) #获取窗口标题
if (win_title)
alter_content = ControlGetText(win_title,'','Static2')
case type
when 'Y'
ControlClick(win_title,'','Button1')
when 'N'
ControlClick(win_title,'','Button2')
end
#puts "安全警告信息:\n#{alter_content}"
$logger.log("the content of Security dialog: #{alter_content} ")
$logger.log('-----------deal with Security dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的clearSecurityAlert(#{type},#{timeout})" ,'N')
return alter_content
end
else
$logger.log("The Security Alert Windows is not exist!")
$logger.log('-----------deal with Security dialog end-----------')
$logger.log("调用函数结束:LibAutoit.rb文件中的clearSecurityAlert(#{type},#{timeout})",'N' )
return false
end
end
end
#功能说明:模拟键盘输入字符
#
#参数说明:
#- string:输入的字符串信息,
#- timeout:对话框处理的超时时间
#
#调用示例:
#- Send("#r") 将发送 Win+r,这将打开“运行”对话框.
#- Send("^!a") 发送按键 "CTRL+ALT+a".
#- Send(" !a") 按下"ALT+a".
#
#返回值说明:无
def SendKey(string = '{ENTER}')
@autoit.Send(string)
end
#功能说明:给对话框中的某个控件设置值
#
#参数说明:
#- win_title:对话框窗口的标题
#- win_text:对话框窗口中显示的文本
#- id:对话框窗口中某个控件的ID
#- string:控件设置的值
#
#调用示例: 无
#
#返回值说明:无
def ControlSetText(win_title,win_text,id,string = '',flag = 1)
#修改指定控件的文本
@autoit.WinActivate(win_title,win_text)
if (ControlFocus(win_title,win_text,id) == 1)
@autoit.ControlSetText(win_title,win_text,id,string)
end
end
#功能说明:向指定控件发送鼠标点击命令
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#- button_type:按键 [可选参数] 要点击的按钮, 可以是"left", "right", "middle", "main", "menu", "primary", "secondary". 默认为left(左键).
#- click_time :要点击鼠标按钮的次数. 默认值为 1.
#
#调用示例: 无
#
#返回值说明:无
def ControlClick(win_title,win_text,id,button_type =1,click_time = 1)
@autoit.AutoItSetOption("WinTitleMatchMode", 3)
@autoit.WinActivate(win_title,win_text)
case button_type
when 1 #点击鼠标左键
button_type = 'left'
when 2 #点击鼠标右键
button_type = 'right'
when 3 #点击鼠标中间键
button_type = 'middle'
end
@autoit.ControlClick(win_title,win_text,id,button_type,click_time)
end
#功能说明:获取指定控件值
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#
#调用示例: 无
#
#返回值说明:
#- 返回获取的文本内容
def ControlGetText(win_title,win_text,id)
if (ControlGetHandle(win_title,win_text,id) != "")
control_text = @autoit.ControlGetText(win_title,win_text,id)
return control_text
end
end
#功能说明:获取指定控件值的句柄
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#
#调用示例: 无
#
#返回值说明:
#- 返回获取的控件句柄
def ControlGetHandle(win_title,win_text,id)
ret = @autoit.ControlGetHandle(win_title,win_text,id)
return ret
end
#功能说明:设置输入焦点到指定窗口的某个控件上
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本.
#- id:目标控件ID
#
#调用示例: 无
#
#返回值说明:无
def ControlFocus(win_title,win_text,id)
#设置输入焦点到指定窗口的某个控件上
ret = @autoit.ControlFocus(win_title,win_text,id)
return ret
end
#功能说明:判断窗口是否存在
#
#参数说明:
#- win_title:目标窗口标题.
#- win_text:目标窗口文本,默认为空
#
#调用示例: 无
#
#返回值说明:返回窗口对象
def WinExists(win_title,win_text = '')
#检查指定的窗口是否存在
ret = @autoit.WinExists(win_title,win_text = '')
return ret
end
end
end
HTML示例,保存到d:\test.html
Code
<html>
<head>
<title>watir处理对话框</title>
<script language= "javascript" type="text/javascript">
function clickbutton(flag)
{
if (flag == 1) alert("测试alter对话框");
if (flag == 2) prompt("测试prompt对话框");
if (flag == 3) confirm('测试confirm对话框', '测试confirm对话框?',"测试结果:");
}
</script>
</head>
<body>
<center>
<H1>watir处理对话框<H1>
<hr>
<table border ="2">
<tr>
<th bgcolor = "#aaaaaa">测试内容</th>
<th bgcolor = "#aaaaaa">操作</th>
</tr>
<tr>
<td>文件上传</td>
<td><input type="file" name="attach[]" /></td>
</tr>
<tr>
<td>alter对话框</td>
<td>
<input type="button" name="alterbutton" value="测试alter对话框" onclick = "clickbutton(1);" />
</td>
</tr>
<tr>
<td>prompt对话框</td>
<td>
<input type="button" name="promptbutton" value="测试prompt对话框" onclick = "clickbutton(2);" />
</td>
</tr>
<tr>
<td>confirm对话框</td>
<td>
<input type="button" name="confirmbutton" value="测试confirm对话框" onclick = "clickbutton(3);" />
</td>
</tr>
</table>
</center>
</body>
</html>
<html>
<head>
<title>watir处理对话框</title>
<script language= "javascript" type="text/javascript">
function clickbutton(flag)
{
if (flag == 1) alert("测试alter对话框");
if (flag == 2) prompt("测试prompt对话框");
if (flag == 3) confirm('测试confirm对话框', '测试confirm对话框?',"测试结果:");
}
</script>
</head>
<body>
<center>
<H1>watir处理对话框<H1>
<hr>
<table border ="2">
<tr>
<th bgcolor = "#aaaaaa">测试内容</th>
<th bgcolor = "#aaaaaa">操作</th>
</tr>
<tr>
<td>文件上传</td>
<td><input type="file" name="attach[]" /></td>
</tr>
<tr>
<td>alter对话框</td>
<td>
<input type="button" name="alterbutton" value="测试alter对话框" onclick = "clickbutton(1);" />
</td>
</tr>
<tr>
<td>prompt对话框</td>
<td>
<input type="button" name="promptbutton" value="测试prompt对话框" onclick = "clickbutton(2);" />
</td>
</tr>
<tr>
<td>confirm对话框</td>
<td>
<input type="button" name="confirmbutton" value="测试confirm对话框" onclick = "clickbutton(3);" />
</td>
</tr>
</table>
</center>
</body>
</html>
处理对话框示例:
testDialog.rb
require 'watir'
require 'libAutoit'
require 'jcode'
$KCODE = 'e'
at = Autoit::AutoItApi.new
winClicker = WinClicker.new
url = "D:\\test.html"
ie =Watir::IE.new
ie.goto(url)
ie.maximize()
sleep(1)
at.DealSecurity("watir处理对话框 - Windows Internet Explorer")
puts "\n"
sleep(1)
#test alter dialog
ie.button(:name,"alterbutton").click_no_wait
sleep(10)
at.DealAlterDialog
puts "\n"
#test prompt dialog
ie.button(:name,"promptbutton").click_no_wait
sleep(10)
at.DealPromptDialog('test')
puts "\n"
#test confirm dialog
ie.button(:name,"confirmbutton").click_no_wait
sleep(10)
at.DealConfirmDialog('Y')
require 'watir'
require 'libAutoit'
require 'jcode'
$KCODE = 'e'
at = Autoit::AutoItApi.new
winClicker = WinClicker.new
url = "D:\\test.html"
ie =Watir::IE.new
ie.goto(url)
ie.maximize()
sleep(1)
at.DealSecurity("watir处理对话框 - Windows Internet Explorer")
puts "\n"
sleep(1)
#test alter dialog
ie.button(:name,"alterbutton").click_no_wait
sleep(10)
at.DealAlterDialog
puts "\n"
#test prompt dialog
ie.button(:name,"promptbutton").click_no_wait
sleep(10)
at.DealPromptDialog('test')
puts "\n"
#test confirm dialog
ie.button(:name,"confirmbutton").click_no_wait
sleep(10)
at.DealConfirmDialog('Y')