Загрузка файлов с использованием Selenium WebDriver и Java Robot Class - PullRequest
16 голосов
/ 10 апреля 2011

Я использую Selenium WebDriver и Java, и мне нужно автоматизировать функцию загрузки файлов.Я много пробовал, но в тот момент, когда нажимается кнопка «Обзор» и открывается новое окно, скрипт перестает выполняться и, скорее, застревает.Я пробовал и в FireFox, и в драйвере IE, но безрезультатно.

Я пробовал также, вызывая файл autoit exe, но когда новое окно открывается при нажатии кнопки "Обзор", конкретное утверждение

Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe")

не может быть запущен.Пожалуйста, помогите

Ответы [ 7 ]

23 голосов
/ 26 мая 2011

Это должно работать с драйверами Firefox, Chrome и IE.

FirefoxDriver driver = new FirefoxDriver();

driver.get("http://localhost:8080/page");

File file = null;

try {
    file = new File(YourClass.class.getClassLoader().getResource("file.txt").toURI());
} catch (URISyntaxException e) {
    e.printStackTrace();
}

Assert.assertTrue(file.exists()); 

WebElement browseButton = driver.findElement(By.id("myfile"));
browseButton.sendKeys(file.getAbsolutePath());
3 голосов
/ 01 декабря 2013

Нажмите на кнопку и используйте приведенный ниже код. Обратите внимание на использование '\\' вместо '\' в имени пути, важно, чтобы код работал ..

WebElement file_input = driver.findElement(By.id("id_of_button"));
file_input.sendKeys("C:\\Selenium\\ImageUpload_FF.exe");
3 голосов
/ 26 июля 2012

Я думаю, мне нужно что-то добавить к ответу Alex .

Я пытался открыть окно Открыть, используя этот код:

driver.findElement(My element).click()

окно открылось, но драйвер перестал отвечать на запросы, и действия в коде даже не попали в действия робота.Я не знаю причину, по которой это происходит, возможно, из-за того, что браузер потерял фокус.

То, как я это сделал, было с помощью класса Actions selenium:

 Actions builder = new Actions(driver);

 Action myAction = builder.click(driver.findElement(My Element))
       .release()
       .build();

    myAction.perform();

    Robot robot = new Robot();
    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);
0 голосов
/ 27 сентября 2017

Используя класс RemoteWebElement, вы можете загрузить файл, используя следующий код.

// TEST URL: "https://www.filehosting.org/"
// LOCATOR: "//input[@name='upload_file'][@type='file'][1]"

LocalFileDetector detector = new LocalFileDetector();
File localFile = detector.getLocalFile( filePath );
RemoteWebElement input = (RemoteWebElement) driver.findElement(By.xpath( locator ));
input.setFileDetector(detector);
input.sendKeys(localFile.getAbsolutePath());
input.click();


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

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

  1. Копировать данные в 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" - Команда ⌘ + Shift + G.
      • Вставить - Команда ⌘ + V и
      • нажмите OK, чтобы открыть его.

enum Action {
    WIN, MAC, LINUX, SEND_KEYS, FILE_DETECTOR;
}
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 if ( type == ActionType.FILE_DETECTOR ) {
        LocalFileDetector detector = new LocalFileDetector();
        File localFile = detector.getLocalFile( filePath );
        RemoteWebElement input = (RemoteWebElement) driver.findElement(By.xpath(locator));
        input.setFileDetector(detector);
        input.sendKeys(localFile.getAbsolutePath());
        input.click();
        return true;
    } else {
        try {
            element.click();

            Thread.sleep( 1000 * 5 );

            setClipboardData(filePath);

            Robot robot = new Robot();
            if( type == Action.MAC ) { // Apple's 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();
}

Использование Selenium: sendKeys () Если вы хотите перенести файл (обратитесь к локальному файлу) с вашего локального компьютера на сервер Grid-Node, вам нужно использовать метод setFileDetector . С помощью этого Selenium-Client будет передавать файл через протокол JSON Wire. Для получения дополнительной информации см. saucelabs fileUpload Example

driver.setFileDetector(new LocalFileDetector());
0 голосов
/ 04 июля 2012

В тот момент, когда открывается модальное диалоговое окно, скрипт не будет работать, он просто зависает. Поэтому сначала позвоните autoit.exe, а затем нажмите, чтобы открыть модальное диалоговое окно.

Работает нормально, вот так,

 Runtime.getRuntime().exec("Upload_IE.exe");
 selenium.click("//input[@name='filecontent']");
0 голосов
/ 24 февраля 2012

Я также использую селеновый webdriver и java, и у меня возникла та же проблема.Я копирую путь к файлу в буфере обмена, а затем вставляю его в «открытое» окно и нажимаю «Enter».Это работает, потому что фокус всегда находится в кнопке «Открыть».

Вот код:

Вам понадобятся следующие классы и метод:

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;


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

Ивот что я делаю, сразу после открытия «открытого» окна:

setClipboardData("C:\\path to file\\example.jpg");
//native key strokes for CTRL, V and ENTER keys
Robot robot = new Robot();
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);

И это все.Это работает для меня, я надеюсь, что это работает для некоторых из вас.

0 голосов
/ 06 октября 2011

или может использовать селен на основе веб-драйвера -

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

и выполнять обычный тип для элемента загрузки

...