Подтвердить что ты не робот

Ручная загрузка файлов с автономным сервером Selenium

Я пытаюсь выполнить testuite на удаленном хосте с использованием Selenium Standalone Server. Он должен загрузить файл. Я использую следующий код для обработки загрузки файлов:

FileBrowserDialogHandler fileBrowserDialogHandler = new FileBrowserDialogHandler();
fileBrowserDialogHandler.fileUploadDialog(fileSource);

Это не работает, когда я выполняю его удаленно, потому что он не может открыть окно выбора файла. Поле ввода выглядит на веб-странице:

< input type = "text" id = "file-path" >

Я заменил текущее решение на WebElement на основе одного, чтобы избежать графического окна, но оно не работает.

WebElement fileInput = driver.findElement(By.id("filepathelement"));
fileInput.sendKeys(filepath);

Тип ввода не является файлом, поэтому код ниже не работает:

driver.findElement(By.id("myUploadElement")).sendKeys("<absolutePathToMyFile>");
4b9b3361

Ответ 1

Загрузите файл с помощью Java Selenium: sendKeys() или Robot Class.

Этот метод предназначен для установки указанного пути к файлу ClipBoard.

  • Скопировать данные в ClipBoard как.

public static void setClipboardData(String filePath) {
    StringSelection stringSelection = new StringSelection( filePath );
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}

  1. Найдите файл в окне Finder и нажмите OK, чтобы выбрать файл.
    • WIN [ Ctrl + V]
    • MAC
      • " Go To Folder" - Command ⌘ + Shift + G.
      • Вставить - Command ⌘ + V и
      • нажмите OK, чтобы открыть его.

enum Action {
    WIN, MAC, LINUX, SEND_KEYS;
}
public static boolean FileUpload(String locator, String filePath, Action type) {
    WebDriverWait explicitWait = new WebDriverWait(driver, 10);

    WebElement element = explicitWait.until(ExpectedConditions.elementToBeClickable( By.xpath(locator) ));
    if( type == Action.SEND_KEYS ) {
        element.sendKeys( filePath );
        return true;
    } else {
        try {
            element.click();

            Thread.sleep( 1000 * 5 );

            setClipboardData(filePath);

            Robot robot = new Robot();
            if( type == Action.MAC ) { // Apple Unix-based operating system.

                // "Go To Folder" on Mac - Hit Command+Shift+G on a Finder window.
                robot.keyPress(KeyEvent.VK_META);
                robot.keyPress(KeyEvent.VK_SHIFT);
                robot.keyPress(KeyEvent.VK_G);
                robot.keyRelease(KeyEvent.VK_G);
                robot.keyRelease(KeyEvent.VK_SHIFT);
                robot.keyRelease(KeyEvent.VK_META);

                // Paste the clipBoard content - Command ⌘ + V.
                robot.keyPress(KeyEvent.VK_META);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_META);

                // Press Enter (GO - To bring up the file.)
                robot.keyPress(KeyEvent.VK_ENTER);
                robot.keyRelease(KeyEvent.VK_ENTER);
                return true;
            } else if ( type == Action.WIN || type == Action.LINUX ) { // Ctrl + V to paste the content.

                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
            }

            robot.delay( 1000 * 4 );

            robot.keyPress(KeyEvent.VK_ENTER);
            robot.keyRelease(KeyEvent.VK_ENTER);
            return true;
        } catch (AWTException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return false;
}

Тест загрузки файлов : - Вы можете найти fileUploadBytes.html, нажав Try it Yourself.

public static void uploadTest( RemoteWebDriver driver ) throws Exception {
    //driver.setFileDetector(new LocalFileDetector());
    String baseUrl = "file:///D:/fileUploadBytes.html";
    driver.get( baseUrl );
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    FileUpload("//input[1]", "D:\\log.txt", Action.SEND_KEYS);

    Thread.sleep( 1000 * 10 );

    FileUpload("//input[1]", "D:\\DB_SQL.txt", Action.WIN);

    Thread.sleep( 1000 * 10 );

    driver.quit();
}

Для получения дополнительной информации см. my post.