2016-04-25 3 views
0

Ich versuche, den Dateidownload mit Selenium zu automatisieren.JAVA Selenium Webdriver Fragen Sie, wo Sie jede Datei vor dem Download speichern können

Immer wenn eine Datei zum Herunterladen empfangen wird, möchte ich diese bestimmte Datei an einem benutzerdefinierten Speicherort speichern und mit einem benutzerdefinierten Namen speichern.

Ich möchte, dass der Browser bittet, jede Datei zu speichern, damit ich den Pfad und den Dateinamen dynamisch angeben kann.

Ich kann die Datei in benutzerdefinierten Verzeichnis speichern, aber ich konnte nicht die Kontrolle über den Dateinamen. Ich möchte java.awt.Robot, java.awt.datatransfer.StringSelection und java.awt.Toolkit für die Verwendung eines benutzerdefinierten Dateinamens verwenden.

Mein Code

ChromeOptions chromeOptions = new ChromeOptions(); 
HashMap<String, Object> chromePreferences = new HashMap<String, Object>(); 
chromePreferences.put("profile.default_content_settings.popups", 0); 
chromePreferences.put("download.default_directory", browserDownloadDirectoryPath); 
chromePreferences.put("safebrowsing.enabled", "true"); 
chromeOptions.setExperimentalOption("prefs", chromePreferences); 
chromeOptions.addArguments("--test-type"); 
chromeDesiredCapabilities = DesiredCapabilities.chrome(); 
chromeDesiredCapabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions); 

Diese Datei, um benutzerdefinierte Ordner zu speichern.

Wenn der Browser nach der Dateispeicherung fragt, möchte ich die Robot-Klasse verwenden, um den Pfad zu senden.

StringSelection stringSelection = new StringSelection(
       "<file path>" + "<file name>"); 
Toolkit.getDefaultToolkit().getSystemClipboard() 
       .setContents(stringSelection, null); 

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_TAB); 
robot.keyRelease(KeyEvent.VK_TAB); 
robot.keyPress(KeyEvent.VK_DOWN); 
robot.keyRelease(KeyEvent.VK_DOWN); 
robot.keyPress(KeyEvent.VK_DOWN); 
robot.keyRelease(KeyEvent.VK_DOWN); 
robot.keyPress(KeyEvent.VK_TAB); 
robot.keyRelease(KeyEvent.VK_TAB); 
robot.keyPress(KeyEvent.VK_ENTER); 
robot.keyRelease(KeyEvent.VK_ENTER); 

Bitte stellen Sie eine Lösung zur Verfügung, um den Browser zu zwingen, die Datei zu speichern.

Für Firefox haben wir about:config, um alle Einstellungen für den Browser zu sehen. Haben wir so etwas auch für andere Browser?

+0

können Sie überprüfen, dies heraus und sehen, ob es ein ähnliches Java-Gegenstück gibt. http://stackoverflow.com/questions/18954686/how-to-download-file-using-selenium – mootmoot

Antwort

1

Stellen Sie die gewünschte Funktion für den Chrome-Browser ein.

String downloadFilepath = "your path to save file"; 
    HashMap<String, Object> chromePrefs = new HashMap<String, Object>(); 
    chromePrefs.put("profile.default_content_settings.popups", 0); 
    chromePrefs.put("download.default_directory", downloadFilepath); 
    ChromeOptions options = new ChromeOptions(); 
    options.setExperimentalOption("prefs", chromePrefs); 
    DesiredCapabilities cap = DesiredCapabilities.chrome(); 
    cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); 
    cap.setCapability(ChromeOptions.CAPABILITY, options); 
    WebDriver driver = new ChromeDriver(cap); 
3

Eine bessere Möglichkeit zur Einrichtung Chrom würde automatisch die Datei herunterzuladen, dann für eine neue Datei warten zu erscheinen und schließlich umbenennen.

Hier ist ein Beispiel ein PDF zum Download durch Klicken auf einen Link und dann umbenennen in „mydocument.pdf“:

// define the download folder 
Path download_folder = Paths.get(System.getProperty("user.home") + "/Downloads"); 

// define the preferences 
HashMap<String, Object> prefs = new HashMap<String, Object>(); 
prefs.put("download.default_directory", download_folder.toAbsolutePath()); 
prefs.put("download.prompt_for_download", false); 
prefs.put("download.directory_upgrade", true); 
prefs.put("plugins.plugins_disabled", new String[]{"Chrome PDF Viewer"}); 

// define the options 
HashMap<String, Object> options = new HashMap<String, Object>(); 
options.put("prefs", prefs); 

// define the capabilities 
DesiredCapabilities capabilities = DesiredCapabilities.chrome(); 
capabilities.setCapability("chromeOptions", options); 

// start the driver 
WebDriver driver = new ChromeDriver(capabilities); 

// click on a PDF link 
driver.get("http://www.adobe.com/legal/terms.html"); 
driver.findElement(By.linkText("Adobe Creative SDK")).click(); 

// wait for the PDF to be downloaded 
File file = WaitForNewFile(download_folder, ".pdf", 60); 

// rename the downloaded file 
file.renameTo(download_folder.resolve("mydocument.pdf").toFile()); 

// quit 
driver.quit(); 

Und für die Datei Kellner:

/** 
* Waits for a new file to be downloaded with a file watcher 
*/ 
public static File WaitForNewFile(Path folder, String extension, int timeout_sec) throws InterruptedException, IOException { 
    long end_time = System.currentTimeMillis() + timeout_sec * 1000; 
    try (WatchService watcher = FileSystems.getDefault().newWatchService()) { 
     folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); 
     for (WatchKey key; null != (key = watcher.poll(end_time - System.currentTimeMillis(), TimeUnit.MILLISECONDS)); key.reset()) { 
      for (WatchEvent<?> event : key.pollEvents()) { 
       File file = folder.resolve(((WatchEvent<Path>)event).context()).toFile(); 
       if (file.toString().toLowerCase().endsWith(extension.toLowerCase())) 
        return file; 
      } 
     } 
    } 
    return null; 
} 
+0

Ich weiß nicht, welche Art von Datei heruntergeladen wird. Was mache ich dann? – Venkatesh

+0

'download.directory_upgrade' - was bedeutet das? – Venkatesh

+0

Für eine Beschreibung der Voreinstellungen: https://chromium.googlesource.com/chromium/src/+/master/chrome/common/pref_names.cc –

Verwandte Themen