`
zmx955
  • 浏览: 19173 次
社区版块
存档分类
最新评论

关于java调用autoit脚本的问题

 
阅读更多
由于selenium本身的局限性,我们在做web测试的时候,不得不使用autoit作为辅助工具来处理一些windows窗口的操作。

先来段autoit代码:

    Sleep($CmdLine[1])

编译成exe文件,文件名为sleep.exe,放在c盘根目录下,代码的功能很简单,就是根据传入的时间休眠。cmd下执行:c:\sleep.exe 2000,表示休眠2秒。

我们在Java中调用这个程序:

   long time1 = System.currentTimeMillis();
                    try {
                            Runtime.getRuntime().exec("c://sleep.exe 10000");
                            long time2 = System.currentTimeMillis();
                            System.out.println((time2 - time1) + "毫秒。");
                    } catch (Exception e) {
                            e.printStackTrace();
                    }

用上面这段代码去调用的话,java不会等待autoit的执行,sleep启动后,继续往下执行,这样几乎没有实际的应用价值。我们通常都是要等autoit去把该做的事情都做完再做后面的事情。

    long time1 = System.currentTimeMillis();
                    try {
                            Runtime.getRuntime().exec("c://sleep.exe 10000").waitFor();
                            long time2 = System.currentTimeMillis();
                            System.out.println((time2 - time1) + "毫秒。");
                    } catch (Exception e) {
                            e.printStackTrace();
                    }

我们在代码中加入waitFor(),可以达到上面的效果,但是又带来了另外一个问题,玩意autoit执行出了问题,一直不退出怎么办?程序就hang住了。

向高人讨教了一番,知道了如何控制autoit的超时问题,我们可以利用检查内存中是否存在au3进程的方式来做判断程序是否执行完毕,同时加一个超时控制,超时则继续往后执行,下面是demo 代码:

Java代码:

    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStreamReader;
     
    public class Runau3 {
            public static void main(String[] args) {
                    // 执行au3脚本
                    // 休眠的那个脚本,脚本所在的目录(秒),等待时间,脚本的休眠时间(毫秒)
                    runAu3("sleep.exe", "c://", 5, "10000");
            }
     
            /**
             * 
             * @param filename
             *            au3的文件名,必须编译成exe
             * @param filepath
             *            au3的文件的路径
             * @param timeout
             *            超时时间(秒)
             * @param args
             *            au3的参数
             */
            public static void runAu3(String filename, String filepath, int timeout,
                            String... args) {
                    try {
                            // 如果发现进程,先杀了
                            if (findProcess(filename)) {
                                    killProcess(filename);
                            }
                            // 拼装命令
                            String cmd = filename;
                            for (String arg : args) {
                                    cmd += " " + arg;
                            }
     
                            // 执行au3脚本
                            Runtime.getRuntime()
                                            .exec("cmd /C " + cmd, null, new File(filepath));
                            int count = 0;
                            while (findProcess(filename) && count < timeout) {
                                    System.out.println(count);
                                    Thread.sleep(1000);
                                    count++;
                            }
                            // 如果进程未结束,杀了
                            if (findProcess(filename)) {
                                    killProcess(filename);
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
     
            }
     
            /**
             * 查找进程
             * @param processname
             * @return
             */
            public static boolean findProcess(String processname) {
                    BufferedReader bufferedreader = null;
                    try {
                            Process proc = Runtime.getRuntime().exec(
                                            "tasklist /fi \" imagename eq " + processname + " \" ");
                            bufferedreader = new BufferedReader(new InputStreamReader(proc
                                            .getInputStream()));
                            String line = null;
                            while ((line = bufferedreader.readLine()) != null) {
                                    if (line.contains(processname)) {
                                            return true;
                                    }
                            }
                            return false;
                    } catch (Exception ex) {
                            ex.printStackTrace();
                            return false;
                    } finally {
                            if (bufferedreader != null) {
                                    try {
                                            bufferedreader.close();
                                    } catch (Exception ex) {
                                    }
                            }
                    }
            }
     
            /**
             * 杀进程
             * @param processname
             */
            public static void killProcess(String processname) {
                    BufferedReader bufferedreader = null;
                    try {
                            Process proc = Runtime.getRuntime().exec(
                                            "taskkill /F /IM " + processname);
                            bufferedreader = new BufferedReader(new InputStreamReader(proc
                                            .getInputStream()));
                            String line = null;
                            while ((line = bufferedreader.readLine()) != null) {
                                    System.out.println(line);
                            }
                    } catch (Exception ex) {
                            ex.printStackTrace();
                    } finally {
                            if (bufferedreader != null) {
                                    try {
                                            bufferedreader.close();
                                    } catch (Exception ex) {
                                    }
                            }
                    }
            }
    }
分享到:
评论

相关推荐

    selenium+autoit3

    3. **集成到Selenium**:在Selenium测试脚本中,调用这个编译后的AutoIt脚本,通过执行文件路径和参数来运行。 4. **测试执行**:执行Selenium测试套件,Selenium会根据需要调用AutoIt3脚本,完成自动化测试过程。 ...

    AutoIt工具及jar包

    例如,如果你有一个需要自动化处理的Windows应用,可以使用Java编写主逻辑,通过Jacob调用COM对象进行交互,再借助AutoItx4Java调用AutoIt的脚本来处理更复杂的界面交互。 总结一下,AutoIt是一种强大的Windows脚本...

    selenium&autoIt实现图片上传的自动化

    为了解决这个问题,我们可以使用AutoIt这个专门用于自动化Windows应用程序的工具,来实现文件上传操作。 AutoIt是Windows自动化工具,可以用来自动化Windows应用程序的操作。它可以模拟用户交互,例如点击按钮、...

    AutoitX4Java(Source).zip_Autoit java_autoit4java_autoitx_autoitx

    AutoIt的是Microsoft Windows的非常有用的自动化脚本语言。它允许使用GUI自动化一个非常简单的语法,并且可以是用于测试的Windows应用程序是有用的。它被打包AutoItX它支持通过COM对象访问AutoIt的功能。 AutoItX4...

    autoitx4java.jar

    这个jar文件内部封装了对AutoIt的DLL(动态链接库)的调用,通过Java的JNI(Java Native Interface)技术,实现了Java与AutoIt的无缝集成。 二、Java与AutoIt的结合 1. JNI接口:JNI是Java平台的标准部分,允许...

    利用autoIT脚本实现文件自动上传功能

    资源针对中文版的chrome文件上传已经调试通过, 使用java代码调用执行 即可实现文件自动上传操作。 如果你调用有问题,可以联系我解决

    AutoIt installer.zip

    总之,"AutoIt installer.zip" 提供了搭建和使用AutoIt环境的必要组件,对于需要进行软件测试或自动化任务的用户来说,这是一个非常实用的工具包。通过安装这两个程序,用户可以方便地创建和执行AutoIt脚本,实现...

    AutoIt3CHS.zip

    - **Java与AutoIt**:通过Java的JNI(Java Native Interface)或者JNA(Java Native Access)库,Java程序可以调用AutoIt编写的函数,实现更复杂的任务。 5. **扩展与库** - **UDF(User-Defined Functions)**:...

    《Let's_AutoIt》自由天空AU3零起步教程PDF加书签

    与C++、Java等“大型”编程语言相比,AutoIt的学习曲线更为平缓,它的语法简洁明了,易于理解,特别适合于非编程专业人士。AutoIt专注于Windows平台的自动化,这意味着用户可以迅速学会如何编写脚本来自动化常见的...

    基于Selenium和AutoIt的办公系统自动化实现———以青岛核对系统为例.rar

    然后,当需要与桌面应用交互时,Selenium可以调用预先编写好的AutoIt脚本,例如,打开一个Excel文件,读取或写入数据,再将结果传回网页端。这种混合自动化方式可以覆盖到办公系统的各个层面,极大地提高了工作效率...

    java模拟键盘鼠标

    在Java编程语言中,模拟键盘和鼠标操作是一项实用的技术,特别是在自动化测试、脚本编写以及无人值守的任务执行等场景中。这个"java模拟键盘鼠标"的项目,从描述来看,主要是用于批量登录QQ账号,这涉及到Java自动化...

    windows系统bat自动打开jar包、并按f12

    - **编写脚本**:使用AutoIt的Scite编辑器创建一个新的脚本,例如`pressF12.au3`,内容如下: ```autoit #NoTrayIcon Sleep(5000) ; 延迟5秒,确保JAR文件已经启动 Send("{F12}") ; 发送F12键 ``` - **编译...

    利用autoIt实现文件自动上传

    已经封装好的脚本,使用java代码调用即可实现文件自动上传操作,参数为需要上传文件的路径,本脚本只针对英文版的chrome ,其它版本的浏览器未经过调试,如果有需要可以联系我。 java代码调用如下 autoItScriptPath ...

    autoit的安装包autoit-v3-setup

    一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)的自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。支持java,python

    基于Selenium和AutoIt的办公系统自动化实现———以青岛核对系统为例.pdf

    3. 使用AutoIt处理可能出现的系统弹窗,例如文件保存对话框,自动选择保存路径并点击保存。 4. 在系统中执行核对操作,Selenium可以模拟用户点击“核对”按钮,等待结果返回。 5. 收集核对结果,如果需要,AutoIt...

    自动化测试案例-输入法JAVA自动化测试-附带源码

    - 文档提到Java无法模拟右方向键,因此使用AutoIt v3编写了一段简单的脚本(`send("{right}")`)来解决这个问题,将它编译为EXE文件执行,实现了右方向键的功能。 3. **测试环境**: - 测试环境设定为XP SP3中文...

    JCBjava应用定制工厂

    - **autoit**:这是一款自动化脚本语言,可能被用来创建JCBjava应用定制工厂的安装脚本或自解压程序,帮助用户更轻松地部署和执行Java应用程序。 - **Debug.bat**:通常用于调试程序,它可能包含了调用Java命令行...

Global site tag (gtag.js) - Google Analytics