zoukankan      html  css  js  c++  java
  • selenium解决上传文件问题之总结

    一、上传文件框是input形式

    • 首先定位上传按钮
    • 发送要上传的文件
    driver.findElement(By.id("XX")).sendKeys("D:\20.jpg");

    利用Robot类处理文件上传。

    其大致流程可以为:

    1、 利用selenium点击web上本地文件的上传按钮;

    2、 在弹出的弹框中,文件路径输入框默认的是光标的聚焦,将文件在磁盘上的路径通过拷贝和黏贴的方法写上去。

    3、 通过按下回车,默认触发弹框的确定按钮,完成文件上传的功能。

    这里以百度首页的利用图片搜索为例:

      打开百度首页,搜索按钮左侧有一个照相机的图标,点击可以选择图片搜索,我们通过本地上传图片的过程来模拟文件自动化上传操作。准备条件,在百度图片搜索一个图片,保存到桌面,例如找到一个关于selenium的图片,然后保存在桌面,名称为selenium.jpg。

    相关实现代码如下:

    import java.awt.Robot;
    
    import java.awt.Toolkit;
    
    import java.awt.datatransfer.StringSelection;
    
    import java.awt.event.KeyEvent;
    
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.By;
    
    import org.openqa.selenium.WebDriver;
    
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    public class shangchuang {
    
    public static void main(String[] args)throws Exception {
    
        WebDriver driver=new FirefoxDriver();
    
        driver.manage().window().maximize();
    
        driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
    
       
    
        driver.get("https://www.baidu.com");
    
        //指定图片路径
    
        StringSelection selection=new StringSelection("C:\Users\你的用户名\Desktop\selenium.jpg");
    
        //把图片路径复制到剪切板
    
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
    
        System.out.println("selection"+selection);
    
        //点击照相机这个工具
    
        driver.findElement(By.xpath("//*/span[@class='soutu-btn']")).click();
    
        //点击本地上传图片
    
        driver.findElement(By.xpath("//*/div[@class='upload-wrap']")).click();
    
      
    
        //新建一个Robot类的对象
    
        Robot robot=new Robot();
    
        Thread.sleep(1000);
    
        //按下Ctrl+V
    
        robot.keyPress(KeyEvent.VK_CONTROL);
    
        robot.keyPress(KeyEvent.VK_V);
    
        //释放Ctrl+V
    
        robot.keyRelease(KeyEvent.VK_CONTROL);
    
        robot.keyRelease(KeyEvent.VK_V);
    
        Thread.sleep(2000);
    
        //点击回车
    
        robot.keyPress(KeyEvent.VK_ENTER);
    
        robot.keyRelease(KeyEvent.VK_ENTER);
    
    }
    
    }

    二、上传文件框不是input形式

    • 当上传文件框不是input时,需要借助AutoIT这个工具
    • 下载地址:https://www.autoitscript.com/site/autoit/downloads/
    • 注意一下,安装过程中32位还是64位,安装后,在开始菜单中会显示这些:

    • 常用的三个组件:
    • AutoIT Window Info(x64) :用来定位
    • SciTE Script Editor :用来写脚本
    • Compile Script to .exe(x64):用来转换成exe

    下面开始定位上传框:

    1. 将Finder Tool拖拽到文件名处,如图:
      这里写图片描述
    2. 记录一下如下内容:
      Title=打开,ClassnameNN=Edit1,Class=#32770

    注:每个浏览器打开的上传框的title不一样,需注意。
      3. 再次定位打开按钮:

      1. 记录如下内容:
        ClassnameNN=Button1
      2. 打开SciTE Script Editor 开始写脚本:
    ;ControlFocus("title" ,"text",controlID)定位到打开窗口
    ControlFocus("打开","","Edit1")
    ;等待元素出现,时间为20s
    WinWait("[CLASS:#32770]","",20)
    ;设置上传的文件
    ControlSetText("打开","","Edit1","C:UsersYBBDesktop1.png")
    ;点击上传按钮
    ControlClick("打开","","Button1");

    测试是否成功的方法:

      • 在浏览器中测试:
        点击上传文件按钮后,弹出选择文件框,运行脚本时,要保证此窗口打开状态,在SciTE Script Editor中点击Tools的GO,即可运行成功。如图:
        这里写图片描述

    在cmd中测试:
    首先要将SciTE Script Editor中编写的脚本转换成exe文件,就需要用到Compile Script to .exe(x64),打开后如图:
    这里写图片描述
    打开cmd,输入如下图, 双引号不要省略:
    这里写图片描述
    把脚本代码放进eclipse中,先定位上传文件按钮,

    第一种写法:
    driver.findElement(By.xpath("XXXX")).click();
    String[] str = {"C:\Users\YBB\Desktop\upload.exe"};
    try{
       Runtime.getRuntime().exec(str);
    }catch(IOException e){
       e.printStackTrace();
    }
    
    第二种写法比较简便:
    driver.findElement(By.xpath("XXXX")).click();
    Runtime.getRuntime().exec("C:\Users\YBB\Desktop\upload.exe");

    执行之后,上传成功!

    如果遇到upload.exe不好用,重新保存一次就好了。

  • 相关阅读:
    二维码生成:使用 JavaScript 库QRCode.js生成二维码
    VC++6.0远程调试(亲试成功)
    Linux同时安装python2和Python3
    Python打包-py2exe
    camera按键采集图像及waitKey的用法(转)
    ucos实时操作系统学习笔记——任务间通信(信号量)(转)
    STM32硬件IIC驱动设计(转)
    基于STM32F4移植W5500官方驱动库ioLibrary_Driver(转)
    USB基础知识概论(版本:v0.9.2)
    usb帧格式
  • 原文地址:https://www.cnblogs.com/wsy0202/p/13072919.html
Copyright © 2011-2022 走看看