Одно решение для выгрузки файлов с использованием Java Robot API с Selenium WebDriver от Java - PullRequest
21 голосов
/ 24 февраля 2012

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

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

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

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);

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

Ответы [ 4 ]

29 голосов
/ 23 мая 2012

На самом деле, для этого тоже есть встроенная техника. Он должен работать во всех браузерах и операционных системах.

Selenium 2 (WebDriver) Пример Java:

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.xpath("//input[@type='file']"));
fileInput.sendKeys("C:/path/to/file.jpg");

Идея состоит в том, чтобы напрямую отправить абсолютный путь к файлу к элементу, на который вы обычно нажимаете, чтобы получить модальное окно - это элемент <input type='file' />.

3 голосов
/ 09 июля 2013

Спасибо, Алекс,

API Java Robot помог мне при загрузке файла. Я был сыт по горло Загрузкой Файла, используя WebDriver. Ниже приведен код, который я использовал (Небольшая модификация вашего):

Robot robot = new Robot();
robot.delay(1000);

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);
robot.delay(1000);
0 голосов
/ 22 сентября 2017

Переключение приложения на Mac гораздо лучше делать с AppleScript.AppleScript интегрирован в систему, поэтому он всегда будет функционировать и не зависит от порядка приложений на Cmd + Tab.Ваш тест / приложение будет менее хрупким.https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html

Вам нужно только определить, что вы находитесь на Mac и у вас есть название приложения.

Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
            Process process = runtime.exec(args);
0 голосов
/ 30 июля 2013

Спасибо, Алекс!Мне это было нужно, так как я не мог заставить функцию sendKeys работать при использовании через Play Framework 2.1 (оболочка fluentlenium)Я тестирую на Firefox [17.0.7] для Mac, и мне пришлось сделать несколько модов, чтобы он заработал.Ниже приведен пример последнего фрагмента, который я использовал.

    val file = new File(PATH_TO_IPA)
    val stringSelection: StringSelection = new StringSelection(file.getAbsolutePath)
    Toolkit.getDefaultToolkit.getSystemClipboard().setContents(stringSelection, null)
    val robot: Robot = new Robot()
    // Cmd + Tab is needed since it launches a Java app and the browser looses focus
    robot.keyPress(KeyEvent.VK_META)
    robot.keyPress(KeyEvent.VK_TAB)
    robot.keyRelease(KeyEvent.VK_META)
    robot.keyRelease(KeyEvent.VK_TAB)
    robot.delay(500)
    robot.keyPress(KeyEvent.VK_META)
    robot.keyPress(KeyEvent.VK_SHIFT)
    robot.keyPress(KeyEvent.VK_G)
    robot.keyRelease(KeyEvent.VK_META)
    robot.keyRelease(KeyEvent.VK_SHIFT)
    robot.keyRelease(KeyEvent.VK_G)
    robot.keyPress(KeyEvent.VK_META)
    robot.keyPress(KeyEvent.VK_V)
    robot.keyRelease(KeyEvent.VK_META)
    robot.keyRelease(KeyEvent.VK_V)
    robot.keyPress(KeyEvent.VK_ENTER)
    robot.keyRelease(KeyEvent.VK_ENTER)
    robot.delay(500)
    robot.keyPress(KeyEvent.VK_ENTER)
    robot.keyRelease(KeyEvent.VK_ENTER)
...