前言
selenium的文件上傳大概分兩種,第一種是inputl類型的上傳,這種是比較原生的html采用的做法柒瓣,網(wǎng)上示例比較多,而且也比較簡(jiǎn)單吠架,就是獲取元素后sendKey芙贫,這里就不過(guò)多贅述了,本文主要針對(duì)現(xiàn)有的比較流行的前端技術(shù)傍药,比如element-ui這種組件庫(kù)的上傳磺平。
組件結(jié)構(gòu)
element的文件上傳基本上沒(méi)有暴露太多的東西在外面,也就是說(shuō)點(diǎn)擊上傳后拐辽,獲取的之后文件信息是放在內(nèi)存里面的拣挪,這就沒(méi)有辦法直接進(jìn)行操作。而且點(diǎn)擊上傳之后俱诸,彈出的選擇文件窗口selenium的驅(qū)動(dòng)是無(wú)法獲取到的菠劝,這個(gè)窗口是由系統(tǒng)提供,已經(jīng)脫離了瀏覽器的控制了乙埃。
轉(zhuǎn)換思路
網(wǎng)上的大部分思路都是采用其他第三方工具進(jìn)行系統(tǒng)窗口的獲取闸英,模擬鍵盤輸入,并輸入文件路徑介袜。
既然可以模擬鍵盤輸入甫何,那么java也可以模擬鍵盤輸入,而且 點(diǎn)擊上傳之后輸入的焦點(diǎn)就在文件名的窗口內(nèi)遇伞,也就是說(shuō)我們可以直接模擬鍵盤輸入將文本輸入在文件名的輸入框中辙喂。
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 == ':') {
// 這里也要注意冒號(hào)的問(wèn)題
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);
進(jìn)階版本
第一版經(jīng)過(guò)多次嘗試已經(jīng)可以成功將文件上傳至瀏覽器中,在element組件庫(kù)中模擬了一下是沒(méi)有問(wèn)題的,但是有一個(gè)其他問(wèn)題巍耗,不能輸入中文秋麸,因?yàn)槲覀兪悄M按鍵的行為,如果文件目錄是帶中文的話炬太,這里是沒(méi)有辦法輸入的灸蟆,因?yàn)榘存I不是中文。再次轉(zhuǎn)換思路
訪問(wèn)剪切板
我們將需要輸入的內(nèi)容放入剪切板亲族,在使用的時(shí)候直接模擬ctrl+v再加上回車就可以直接上傳進(jìn)去了炒考。
代碼如下
Robot robot = new Robot();
String filePath = "C:\\Users\\administrator\\Desktop\\file\\1.png";
StringSelection selection = new StringSelection(filePath);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 將文本放入剪切板中,這里的null是剪切板擁有者霎迫,我們可以傳個(gè)null進(jìn)去
clipboard.setContents(selection, null);
// 模擬系統(tǒng)按鍵按下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);