java selenium selenium-webdriver awtrobot

Carga de archivos usando Selenium WebDriver y Java Robot Class



selenium-webdriver awtrobot (7)

Estoy usando Selenium WebDriver y Java y necesito automatizar la función de carga de archivos. Intenté mucho, pero en el momento en que se hace clic en el botón Examinar y se abre una nueva ventana, el script deja de ejecutarse y se atasca. He intentado tanto en Firefox y el controlador de IE, pero sin éxito.

También lo intenté llamando a un archivo autoit exe, pero a medida que la nueva ventana se abre al hacer clic en el botón Examinar, la declaración particular

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

no podría ser ejecutado Ayuda amable


Al usar la clase RemoteWebElement , puede RemoteWebElement el archivo usando el siguiente código.

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

Cargue un archivo utilizando Java Selenium: sendKeys() o Robot Class .

Este método es establecer la ruta de archivo especificada en el ClipBoard.

  1. Copie los datos a ClipBoard como.

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

  1. Localice el archivo en la ventana del Finder y presione OK para seleccionar el archivo.
    • GANAR [ Ctrl + V]
    • MAC
      • " Go To Folder " - Comando ⌘ + Shift + G.
      • Pegar - Comando ⌘ + V y
      • presione OK para abrirlo.

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

Prueba de fileUploadBytes.html archivos : - Puede encontrar el archivo fileUploadBytes.html haciendo clic en 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(); }

Uso de Selenium: sendKeys () Cuando desee transferir un archivo (consulte un archivo local) desde su computadora local al servidor Grid-Node, debe usar el método setFileDetector . Al utilizar este Selenium-Client, se transferirá el archivo a través del protocolo JSON Wire. Para obtener más información, consulte el saucelabs fileUpload Example

driver.setFileDetector(new LocalFileDetector());


Creo que necesito agregar algo a la respuesta de Alex .

Intenté abrir la ventana Abrir usando este código:

driver.findElement(My element).click()

Se abrió la ventana, pero el controlador dejó de responder y las acciones en el código ni siquiera llegaron a las acciones del Robot. No sé la razón por la que esto sucede, probablemente porque el navegador perdió el enfoque.

La forma en que lo hice fue usando la clase de selenio de Acciones:

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


El momento después de que se abra el diálogo modal, el script no funcionará, simplemente se bloquea. Entonces llame primero a autoit.exe y luego haga clic para abrir el cuadro de diálogo modal.

Funciona bien asi

Runtime.getRuntime().exec("Upload_IE.exe"); selenium.click("//input[@name=''filecontent'']");


Esto debería funcionar con los controladores de Firefox, Chrome e 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());


Haga clic en el botón y utilice el código de abajo. Observe el uso de ''//' en lugar de ''/' en el nombre de la ruta, es importante que el código funcione .

WebElement file_input = driver.findElement(By.id("id_of_button")); file_input.sendKeys("C://Selenium//ImageUpload_FF.exe");


También uso el controlador web de selenio y java, y tuve el mismo problema. Lo que hago es copiar la ruta al archivo en el portapapeles y luego pegarlo en la ventana "abrir" y hacer clic en "Enter". Esto está funcionando porque el foco está siempre en el botón "abrir".

Aquí está el código:

Necesitarás estas clases y método:

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

Y eso es lo que hago, justo después de abrir la ventana "abrir":

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

Y eso es. Está funcionando para mí, espero que funcione para algunos de ustedes.


o puede usar selenio respaldado por webdriver -

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

y hacer el tipo habitual en el elemento de carga