2017-09-15 43 views
13

Próbuję wykonać testsuite na zdalnym hoście za pomocą Selenium Standalone Server. Powinien przesłać plik. obsługiwać przesyłanie plików używam kodu poniżej:Obsługa przesyłania plików za pomocą serwera autonomicznego Selenium

FileBrowserDialogHandler fileBrowserDialogHandler = new FileBrowserDialogHandler(); 
fileBrowserDialogHandler.fileUploadDialog(fileSource); 

To nie działa, kiedy go wykonać zdalnie, ponieważ nie jest w stanie otworzyć okno wyboru pliku. Pole wejściowe wygląda to na stronie internetowej:

< input type = "text" id = "file-path"> prąd

Wymieniłem rozwiązanie z WebElement opartego uniknięcia graficznego okna, ale to nie działa.

WebElement fileInput = driver.findElement(By.id("filepathelement")); 
fileInput.sendKeys(filepath); 

typ pliku wejściowego nie jest, więc poniższy kod nie działa:

driver.findElement(By.id("myUploadElement")).sendKeys("<absolutePathToMyFile>"); 
+0

Nie powinno się otwierać okna wyboru pliku. – JeffC

+1

Możliwy duplikat [Jak przesłać plik za pomocą Selenium WebDriver w Javie] (https://stackoverflow.com/questions/16896685/how-to-upload-file-using-selenium-webdriver-in-java) – JeffC

+0

@JeffC: Nie jest to duplikat, ponieważ typ pola jest inny i to rozwiązanie nie działa w tym przypadku. – plaidshirt

Odpowiedz

5

Prześlij plik, używając Java Selenium: sendKeys() lub Robot Class.

Ta metoda służy do ustawiania określonej ścieżki do pliku na tablicy ClipBoard.

  1. Skopiuj dane do ClipBoard jako.

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

  1. Odszukaj plik na okno Findera i naciśnij OK aby wybrać plik.
    • WIN [Ctrl + V]
    • MAC
      • "Go To Folder" - poleceń ⌘ + Przesunięcie + G.
      • Pasta - poleceń ⌘ + V
      • naciśnij OK, aby go otworzyć.

enum Action { 
    WIN, MAC, LINUX, SEND_KEYS; 
} 
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 { 
     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; 
} 

Prześlij plik testowy : - Można znaleźć fileUploadBytes.html plik, klikając na 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(); 
} 

Więcej informacji można znaleźć my post.