selenium文件上傳--java

前言

selenium的文件上傳大概分兩種,第一種是inputl類(lèi)型的上傳,這種是比較原生的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)窗口的獲取,模擬鍵盤(pán)輸入,并輸入文件路徑。
既然可以模擬鍵盤(pán)輸入,那么java也可以模擬鍵盤(pán)輸入,而且 點(diǎn)擊上傳之后輸入的焦點(diǎn)就在文件名的窗口內(nèi),也就是說(shuō)我們可以直接模擬鍵盤(pán)輸入將文本輸入在文件名的輸入框中。

        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 {
                // 大寫(xiě)按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);
                }
            }
        }
          // 最后要按一下回車(chē)
          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再加上回車(chē)就可以直接上傳進(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 并按下回車(chē)
        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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容