Одно решение для загрузки файлов с использованием Java Robot API с Selenium WebDriver от Java
Я видел, что у многих людей проблемы с загрузкой файла в тестовой среде с помощью Selenium WebDriver. Я использую селен WebDriver и java и имею ту же проблему. Я, наконец, нашел решение, поэтому я опубликую его здесь, надеясь, что он поможет кому-то еще.
Когда мне нужно загрузить файл в тесте, я нажимаю кнопку "Webdriver" в кнопке и жду, пока откроется окно "Открыть". И затем я скопирую путь к файлу в буфер обмена, а затем вставьте его в "открытое" окно и нажмите "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);
И все. Он работает для меня, я надеюсь, что это сработает для некоторых из вас.
Ответы
Ответ 1
Собственно, для этого есть встроенная техника. Он должен работать во всех браузерах и операционных системах.
Пример 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' />
.
Ответ 2
Спасибо Алекс,
API Java Robot помог мне загрузить файл. Я был fedup с загрузкой файлов с помощью 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);
Ответ 3
Спасибо, Алекс! Мне это нужно, так как я не мог заставить функцию sendKeys работать при использовании через Play Framework 2.1 (флюентлиум-обертка). Я тестирую 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)
Ответ 4
Переключение приложения на 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);