Загрузка файлов с использованием Selenium WebDriver и Java Robot Class
Я использую Selenium WebDriver и Java, и мне нужно автоматизировать функцию загрузки файлов. Я много пробовал, но после нажатия кнопки "Обзор" и открытия нового окна script перестает выполняться дальше и скорее застревает. Я пробовал как в FireFox, так и в IE, но безрезультатно.
Я также попытался вызвать файл autit exe, но по мере открытия нового окна при нажатии кнопки "Обзор" конкретное утверждение
Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe")
не удалось выполнить. Просьба помочь
Ответы
Ответ 1
Это должно работать с 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());
Ответ 2
Мне кажется, мне нужно добавить что-то в ответ Alex.
Я попытался открыть окно "Открыть", используя этот код:
driver.findElement(My element).click()
Окно открылось, но драйвер стал неактуальным, и действия в коде даже не попали на действия Robot.
Я не знаю, почему это происходит, вероятно, потому, что браузер потерял фокус.
Способ, которым я работал, это использовать класс selenium Actions:
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);
Ответ 3
Нажмите на кнопку и используйте приведенный ниже код. Обратите внимание на использование '\\' вместо '\' в имени пути, важно, чтобы код работал.
WebElement file_input = driver.findElement(By.id("id_of_button"));
file_input.sendKeys("C:\\Selenium\\ImageUpload_FF.exe");
Ответ 4
Я также использую selenium 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);
И все. Он работает для меня, я надеюсь, что это сработает для некоторых из вас.
Ответ 5
Момент после открытия модального диалога script не будет работать, он просто зависает. Поэтому сначала вызовите autoit.exe
, а затем нажмите, чтобы открыть модальный диалог.
Это прекрасно работает,
Runtime.getRuntime().exec("Upload_IE.exe");
selenium.click("//input[@name='filecontent']");
Ответ 6
Используя класс 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.
- Скопируйте данные в ClipBoard как.
public static void setClipboardData(String filePath) {
StringSelection stringSelection = new StringSelection( filePath );
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}
- Найдите файл в окне Finder и нажмите
OK
, чтобы выбрать файл.
- WIN [Ctrl + V]
- MAC
- "
Go To Folder
" - Command ⌘ + Shift + G.
- Вставить - Command ⌘ + 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 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());
Ответ 7
или может использовать selenium на основе веб-драйвера -
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
и выполните обычный тип элемента загрузки -
selenium.sendKeys("file path")