• 【自动化测试】使用Java+selenium填写验证码成功登录


      这是我第一次发博客,若有问题,请多多指教!

      本次是为了帮忙解决,如果在平时自动化遇到有验证码填写的情况,我们如何成功登录情况。

    1. 思路:

        首先我们先将验证码复制并保存成一个图片,然后使用tesseract-ocr这个光学软件识别成txt文件,接着我们只要读取txt文件的内容即可

       2. 使用工具:

        Eclipse、selenium、火狐、log4j、AUTOIT_3.3.14.1、tesseract-ocr

       3. 安装软件

        I. eclipse安装,直接网上下载并安装即可

        II.Selenium和log4j,这两个是个jar包,只需要下载下来即可,然后我们建立项目的时候,可以建立一个文件lib保存起来

        如图:

         

        如何使用这两个jar包?项目à右键—>构建路径à配置购置路径à点击添加jarj即可

         

        III.火狐安装,建议默认安装吧。免得到时候在代码还需添加一句寻找火狐的路径

        IV.AUTOIT_3.3.14.1安装,为什么安装这个呢?是为了解决window自带的操作,例如保存,因为我需要用到另存为图片,所以这个可以帮我解决。安装嘛,我是直接一直next

        V. tesseract-oc,同理安装,不过需要重启一下电脑,它才会把路径写入path

    1. 解决验证码的步骤

    public static void baoCunTuPian(WebDriver driver) throws AWTException, InterruptedException{

    //右键点击浏览器的属性

         Actions action = new Actions(driver);

         action.contextClick(driver.findElement(By.id("ImageButton1"))).build().perform();

         System.out.print("右键打开浏览器属性成功 ");

        Robot robot = new Robot();

         Thread.sleep(1000);

        

         robot.keyPress(KeyEvent.VK_DOWN);

         System.out.print("移动到查看图像");

         Thread.sleep(1000);

        

         robot.keyPress(KeyEvent.VK_DOWN);

         System.out.print("移动到复制图像" +

                 " ");

         Thread.sleep(1000);

        

         robot.keyPress(KeyEvent.VK_DOWN);

         System.out.print("移动到复制图像地址 ");

         Thread.sleep(1000);

        

         robot.keyPress(KeyEvent.VK_DOWN);

         System.out.print("移动到将图像另存为 ");

         Thread.sleep(1000);

        

         robot.keyPress(KeyEvent.VK_ENTER);

         Thread.sleep(1000);

         System.out.print("点击图像弹出另存 ");

        

         robot.keyRelease(KeyEvent.VK_DOWN);//释放向下键,不然在此之前的条目将起作用

         Thread.sleep(1000);

        

         try {

             Runtime.getRuntime().exec("c:\test11.exe");//运行保存

             System.out.print("保存图片成功 ");

         } catch (IOException e) {

             // TODO Auto-generated catch block

             e.printStackTrace();                                        

         }

    }

    这段代码分两部分来解读:右键弹出属性和保存图片

    我们将鼠标的位置指向验证码的图片,然后右键点击

             如图:

       

             然后我们需要找到“将图像另存为”

            

             这段代码就是描述我们如何找到另存并保存起来

             接着,弹出来的另存为的操作就不再是java能够操作的了,我们这时候需要用到另外类似VB的脚本语言,于是我们的AUTOIT登场了。

       

    使用AutoitInfo.exe来定位

     

    然后打开我们的脚本编写工具SciTE.exe

     

    PS:其实下面的那段代码我也不是很懂

    本段代码是为了清理我要存在图片路径是否存在同名,如果同名先删除同名图片

     

    这段代码是将我们另存的图片名为a.png,然后保存到c盘。

    我们写好了这段代码之后,接着使用ctrl+F7,即可将它变为EXE文件。如果报病毒,请不要理它,保证百分百没有病毒的。

     

    好了我们接着就需要调用我们的脚本。我的脚本名字为test11.exe,保存在本机的C盘

    OK,我们现在就已经把图片的保存位置搞定。接着我们需要用tesseract-ocr这个软件来识别我们的图片内容,使用的代码是dos命令,

    命令如下:tesseract.exe c:/a.png c:/a -psm 6

    意思是:将C盘下的a.png识别并保存到C盘的a.txt

    有些人用 tesseract.exe c:/a.png c:/a  -l 就解决了,我的不知道为何需要用-psm 6才能解决

    我们将这条命令保存为.bat格式即可

     

    然后,我们用java的Runtime.getRuntime().exec() 这个方法就可以调用。

    既然已经保存为文件格式,那么我们就需要来读取文件的内容,读取文件内容的代码,我也不讲述了

    public static String txt2String(File file){

            String result = "";

           try{

                BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件

                String s = null;

                while((s = br.readLine())!=null){//使用readLine方法,一次读一行

                   result = result + " " +s;

            }

            br.close();   

           }catch(Exception e){

                e.printStackTrace();

            }

           return result;

    }

    主方法调用

    File file = new File("c:/a.txt");//读取文件

     System.out.println(txt2String(file)+"a");

    存在的问题:orc识别率还是很低,登录成功几率还没有超过90%,有待提高

    解决方案:训练orc的识别率(有时间再推出类似相关的文章)

    一切博文基本原创,谢谢
  • 相关阅读:
    ESFramework Demo -- 动态组及群聊Demo(附源码)
    反射整理学习
    JavaScript 每周导读
    SQLSERVER 中的 with锁级别
    代码细节重构:请对我的代码指手划脚
    SQLServer查询死锁语句
    模块加载系统 v16
    数据结构之排序算法C#实现
    浅谈操作系统对内存的管理
    如何编写可维护的面向对象JavaScript代码
  • 原文地址:https://www.cnblogs.com/mumushizhige/p/8880938.html
Copyright © 2020-2023  润新知