selenium解决上传文件问题之总结

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位,安装后,在开始菜单中会显示这些:

selenium解决上传文件问题之总结

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

下面开始定位上传框:

  1. 将Finder Tool拖拽到文件名处,如图:
    selenium解决上传文件问题之总结
  2. 记录一下如下内容:
    Title=打开,ClassnameNN=Edit1,Class=#32770

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

selenium解决上传文件问题之总结

    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,即可运行成功。如图:
      selenium解决上传文件问题之总结

在cmd中测试:
首先要将SciTE Script Editor中编写的脚本转换成exe文件,就需要用到Compile Script to .exe(x64),打开后如图:
selenium解决上传文件问题之总结
打开cmd,输入如下图, 双引号不要省略:
selenium解决上传文件问题之总结
把脚本代码放进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不好用,重新保存一次就好了。