前言
selenium的文件上传大概分两种,第一种是inputl类型的上传,这种是比较原生的html采用的做法,网上示例比较多,而且也比较简单,就是获取元素后sendKey,这里就不过多赘述了,本文主要针对现有的比较流行的前端技术,比如element-ui这种组件库的上传。
组件结构
element的文件上传基本上没有暴露太多的东西在外面,也就是说点击上传后,获取的之后文件信息是放在内存里面的,这就没有办法直接进行操作。而且点击上传之后,弹出的选择文件窗口selenium的驱动是无法获取到的,这个窗口是由系统提供,已经脱离了浏览器的控制了。
转换思路
网上的大部分思路都是采用其他第三方工具进行系统窗口的获取,模拟键盘输入,并输入文件路径。
既然可以模拟键盘输入,那么java也可以模拟键盘输入,而且 点击上传之后输入的焦点就在文件名的窗口内,也就是说我们可以直接模拟键盘输入将文本输入在文件名的输入框中。
Robot robot = new Robot();
String filePath = "C:\\Users\\administrator\\Desktop\\file\\1.png";
for (Character c : filePath.toCharArray()) {
// 这里需要注意windows的斜杠
if (c == '\\') {
robot.keyPress(KeyEvent.VK_BACK_SLASH);
robot.keyRelease(KeyEvent.VK_BACK_SLASH);
} else if (c == ':') {
// 这里也要注意冒号的问题
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_SEMICOLON);
robot.keyRelease(KeyEvent.VK_SEMICOLON);
robot.keyRelease(KeyEvent.VK_SHIFT);
} else {
// 大写按shift
if (Character.isUpperCase(c)) {
int keyCode = KeyEvent.getExtendedKeyCodeForChar(Character.toLowerCase(c));
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
robot.keyRelease(KeyEvent.VK_SHIFT);
} else {
int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
}
}
}
// 最后要按一下回车
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
进阶版本
第一版经过多次尝试已经可以成功将文件上传至浏览器中,在element组件库中模拟了一下是没有问题的,但是有一个其他问题,不能输入中文,因为我们是模拟按键的行为,如果文件目录是带中文的话,这里是没有办法输入的,因为按键不是中文。再次转换思路
访问剪切板
我们将需要输入的内容放入剪切板,在使用的时候直接模拟ctrl+v再加上回车就可以直接上传进去了。
代码如下
Robot robot = new Robot();
String filePath = "C:\\Users\\administrator\\Desktop\\file\\1.png";
StringSelection selection = new StringSelection(filePath);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 将文本放入剪切板中,这里的null是剪切板拥有者,我们可以传个null进去
clipboard.setContents(selection, null);
// 模拟系统按键按下ctrl+v 并按下回车
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);