关于Selenium 对上载/下载等窗口处理的解决方案

153 views
Skip to first unread message

Jack Zhao

unread,
Jul 18, 2011, 1:57:26 AM7/18/11
to WATF Forum
Selenium 是使用 JavaScript 来模拟操作,因此它不支持像上载/下载 之类的浏览器元素。

在试验了诸多方案之后,终于找到了一种可以解决Selenium对上载/下载等窗口不能控制的方案----Java机器人AutoIt。AutoIt
是一种自动控制工具。它可以被用来自动完成任何基于 Windows 或 DOS 的简单任务。它最初被设计用来自动完成安装那些其它方法不能自动安装
的软件。它可以认识大多数 Window GUI,提供很多 API,并且很容易转换为 .exe 文件,这样的文件可以直接运行或者在 Java 代
码中调用。

现在我为大家演示一下如何利用AutoIt帮助Selenium对上载/下载等窗口的处理:

实例1:下载脚本的步骤是:

(1)激活下载窗口。
(2)对下载窗口的操作。
(3)下载。

1.处理下载的AutoIt脚本:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

handleDownload() ;定义一个方法来处理下载
Func handleDownload()
Dim $title ; 定义窗口标题
$title="Opening en_US_de_DE_TRD.xml"
If $title="Opening en_US_de_DE_TRD.xml" Then ;if判断当title符合条件则执行
下一步
WinActivate($title) ;激活窗口
Send("{DOWN}") ;发送向下键
Send("{Enter}") ;发送Enter键
Else
Exit ;如果不符合则离开
EndIf 结束if判断
$title4="Enter name of file to save to…"
If $title4="Enter name of file to save to…" Then
WinActivate($title4)
ControlClick($title4,"","Button1","")
Else
Exit
EndIf
$title1="Confirm Save As"
If $title1="Confirm Save As" Then
WinActivate($title)
ControlClick($title1,"","Button1","") ;鼠标点击OK或Cancel键
Else
Exit
EndIf
$title2="Downloads"
If $title2="Downloads" Then
WinActivate($title2)
WinClose($title2) ;关闭title2窗口
Else
Exit
EndIf
EndFunc

////////////////////////////////////////////////
Note:写完AutoIt代码后把它保存成.au3格式的文件,用AutoIt v3软件把.au3格式的文件编译成.exe的执行文件。
在Java代码中定义一个函数来执行.exe文件,在浏览器单击browse之后会调用编写的AutoIt函数。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2.Java函数执行.exe文件

public void handleDownload() throws Exception{
String execute_file = "C\\autoTestFiles\\download.exe'';
String cmd = "\"" + execute_file + "\"" ;
try {
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
实例2
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\
AutoIt脚本的步骤
(1) 根据浏览器类型确定上载窗口标题。
(2)激活上载窗口。
(3)将文件路径放入编辑框中。
(4)提交。

1.处理上传的AutoIt脚本

If $CmdLine[0]<2 Then ;首先要确定数组的参数传递到脚本超过1;
Exit
EndIf
handleUpload($CmdLine[1],$CmdLine[2]) ;定义一个方法来处理上传
Func handleUpload($browser, $uploadfile)
Dim $title
If $browser="IE" Then ;判断浏览器的类型
$title="Select File"
Else ;
$title="File Upload"
EndIf

If WinWait($title,"",4) Then ;等待窗口4秒;

WinActivate($title)
ControlSetText($title,"","Edit1",$uploadfile) ;想输
入框写入要上传文件的路径
ControlClick($title,"","Button1")
Else
Return False
EndIf
EndFunc

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\
2.Java函数执行.exe文件

public void handleUpload(String browser, String filepath) throws
Exception {
String execute_file = "C:\\autoTestFiles\\upload.exe";
String cmd = "\"" + execute_file + "\"" + " " + "\"" + browser + "\""
+ " " + "\"" + filepath + "\"";
try {
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\
两个实例演示了AutoIt如何帮助Selenium处理对上载/下载窗口,
但是要注意的一点是:AutoIt 脚本很容易编写,但是依赖于浏览器类型和版本,因为不同的浏览器和版本中,窗口标题和窗口控件类是不相同的,所以在
不同的浏览器和版本我们要编写不同的AutoIt脚本!!!!!!!!!!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
小技巧:在编写AutoIt脚本的时候,验证脚本是否能够成功运行我们可以:打开一个下载/上传的窗口 直接点击.exe文件
看窗口是否正常的实现脚本编写功能。而且还可以用msgBox()方法来验证那个脚本没有运行等情况.....

就简单的写了自己关于Selenium 对上载/下载等窗口处理的观点和做法,如果有什么不明白不详细的地方还请见谅,我们可以共同讨论。。。
O(∩_∩)O~

参考资料:
AutoIt的学习资料可以参考官网和(http://bbs.isbase.net/thread-35311-1-1.html 个人认为蛮不错
的,很详细)。
Java函数的编写可以参考JDK API文档


jest...@welocalize.com

unread,
Jul 18, 2011, 3:43:19 AM7/18/11
to WATF Forum
Hi Jack,

是否可把脚本整理后集成到WATF里?写成通用的函数接口,使其他人都能很方便的使用呢? If yes, Please do it. :)

On 7月18日, 下午1时57分, Jack Zhao <jack.z...@welocalize.com> wrote:
> Selenium是使用 JavaScript 来模拟操作,因此它不支持像上载/下载 之类的浏览器元素。


>
> 在试验了诸多方案之后,终于找到了一种可以解决Selenium对上载/下载等窗口不能控制的方案----Java机器人AutoIt。AutoIt
> 是一种自动控制工具。它可以被用来自动完成任何基于 Windows 或 DOS 的简单任务。它最初被设计用来自动完成安装那些其它方法不能自动安装
> 的软件。它可以认识大多数 Window GUI,提供很多 API,并且很容易转换为 .exe 文件,这样的文件可以直接运行或者在 Java 代
> 码中调用。
>
> 现在我为大家演示一下如何利用AutoIt帮助Selenium对上载/下载等窗口的处理:
>
> 实例1:下载脚本的步骤是:
>
> (1)激活下载窗口。
> (2)对下载窗口的操作。
> (3)下载。
>
> 1.处理下载的AutoIt脚本:

> ///////////////////////////////////////////////////////////////////////////-////////////////////////////////////////


>
> handleDownload() ;定义一个方法来处理下载
> Func handleDownload()
> Dim $title ; 定义窗口标题
> $title="Opening en_US_de_DE_TRD.xml"
> If $title="Opening en_US_de_DE_TRD.xml" Then ;if判断当title符合条件则执行
> 下一步
> WinActivate($title) ;激活窗口
> Send("{DOWN}") ;发送向下键
> Send("{Enter}") ;发送Enter键
> Else
> Exit ;如果不符合则离开
> EndIf 结束if判断

> $title4="Enter name of file to save to..."
> If $title4="Enter name of file to save to..." Then


> WinActivate($title4)
> ControlClick($title4,"","Button1","")
> Else
> Exit
> EndIf
> $title1="Confirm Save As"
> If $title1="Confirm Save As" Then
> WinActivate($title)
> ControlClick($title1,"","Button1","") ;鼠标点击OK或Cancel键
> Else
> Exit
> EndIf
> $title2="Downloads"
> If $title2="Downloads" Then
> WinActivate($title2)
> WinClose($title2) ;关闭title2窗口
> Else
> Exit
> EndIf
> EndFunc
>
> ////////////////////////////////////////////////
> Note:写完AutoIt代码后把它保存成.au3格式的文件,用AutoIt v3软件把.au3格式的文件编译成.exe的执行文件。
> 在Java代码中定义一个函数来执行.exe文件,在浏览器单击browse之后会调用编写的AutoIt函数。
>

> ///////////////////////////////////////////////////////////////////////////-///////////////////////////////////////////////////////////////////////////-////////


> 2.Java函数执行.exe文件
>
> public void handleDownload() throws Exception{
> String execute_file = "C\\autoTestFiles\\download.exe'';
> String cmd = "\"" + execute_file + "\"" ;
> try {
> Process p = Runtime.getRuntime().exec(cmd);
> p.waitFor();
> } catch (Exception e) {
> e.printStackTrace();
> }
>
> }
>

> ///////////////////////////////////////////////////////////////////////////-///////////////////////////////////////////////////////////////////////////-////////

> ///////////////////////////////////////////////////////////////////////////-//////////////////////////////////////////////////////////////////////


> 小技巧:在编写AutoIt脚本的时候,验证脚本是否能够成功运行我们可以:打开一个下载/上传的窗口 直接点击.exe文件
> 看窗口是否正常的实现脚本编写功能。而且还可以用msgBox()方法来验证那个脚本没有运行等情况.....
>

> 就简单的写了自己关于Selenium对上载/下载等窗口处理的观点和做法,如果有什么不明白不详细的地方还请见谅,我们可以共同讨论。。。

Jack Zhao

unread,
Jul 18, 2011, 4:09:19 AM7/18/11
to WATF Forum
Hi Jester,

Java调用.exe文件的函数可以写在BasicFunc类中,.exe文件可以整理统一放入一个文件夹去。但是对于不同的浏览器和版本,他的窗口标
题和控件是不同的,所以对于.exe 文件需要不断的更新。.exe文件是由.au3文件编译过来的,所以不能直接更改.exe,因此对这个过程有点繁
琐。

On 7月18日, 下午3时43分, jester...@welocalize.com wrote:
> Hi Jack,
>
> 是否可把脚本整理后集成到WATF里?写成通用的函数接口,使其他人都能很方便的使用呢? If yes, Please do it. :)
>
> On 7月18日, 下午1时57分, Jack Zhao <jack.z...@welocalize.com> wrote:
>
>
>
> > Selenium是使用 JavaScript 来模拟操作,因此它不支持像上载/下载 之类的浏览器元素。
>
> > 在试验了诸多方案之后,终于找到了一种可以解决Selenium对上载/下载等窗口不能控制的方案----Java机器人AutoIt。AutoIt
> > 是一种自动控制工具。它可以被用来自动完成任何基于 Windows 或 DOS 的简单任务。它最初被设计用来自动完成安装那些其它方法不能自动安装
> > 的软件。它可以认识大多数 Window GUI,提供很多 API,并且很容易转换为 .exe 文件,这样的文件可以直接运行或者在 Java 代
> > 码中调用。
>
> > 现在我为大家演示一下如何利用AutoIt帮助Selenium对上载/下载等窗口的处理:
>
> > 实例1:下载脚本的步骤是:
>
> > (1)激活下载窗口。
> > (2)对下载窗口的操作。
> > (3)下载。
>
> > 1.处理下载的AutoIt脚本:

> > ///////////////////////////////////////////////////////////////////////////--////////////////////////////////////////

> > ///////////////////////////////////////////////////////////////////////////--//////////////////////////////////////////////////////////////////////////-/-////////


> > 2.Java函数执行.exe文件
>
> > public void handleDownload() throws Exception{
> > String execute_file = "C\\autoTestFiles\\download.exe'';
> > String cmd = "\"" + execute_file + "\"" ;
> > try {
> > Process p = Runtime.getRuntime().exec(cmd);
> > p.waitFor();
> > } catch (Exception e) {
> > e.printStackTrace();
> > }
>
> > }
>

> > ///////////////////////////////////////////////////////////////////////////--//////////////////////////////////////////////////////////////////////////-/-////////

> > ///////////////////////////////////////////////////////////////////////////--//////////////////////////////////////////////////////////////////////


> > 小技巧:在编写AutoIt脚本的时候,验证脚本是否能够成功运行我们可以:打开一个下载/上传的窗口 直接点击.exe文件
> > 看窗口是否正常的实现脚本编写功能。而且还可以用msgBox()方法来验证那个脚本没有运行等情况.....
>
> > 就简单的写了自己关于Selenium对上载/下载等窗口处理的观点和做法,如果有什么不明白不详细的地方还请见谅,我们可以共同讨论。。。
> > O(∩_∩)O~
>
> > 参考资料:
> > AutoIt的学习资料可以参考官网和(http://bbs.isbase.net/thread-35311-1-1.html个人认为蛮不错
> > 的,很详细)。

> > Java函数的编写可以参考JDK API文档- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Reply all
Reply to author
Forward
0 new messages