web-dev-qa-db-fra.com

comment modifier l'emplacement de téléchargement de fichier dans Webdriver lors de l'utilisation du pilote chrome driver/firefox

J'essaie de sauvegarder une image en utilisant l'option Enregistrer sous dans un dossier spécifique. J'ai trouvé un moyen par lequel je peux faire un clic droit sur l'image que je veux enregistrer en utilisant Enregistrer en tant qu'option. Mais le problème où je suis bloqué est après avoir obtenu la fenêtre du système d'exploitation qui demande où enregistrer le fichier. Je ne peux pas envoyer l'emplacement souhaité car je ne sais pas comment le faire. Je suis passé par les questions similaires posées sur ce forum mais aucune d’elles n’a aidé jusqu’à présent.

Code is-

Pour Firefox

public class practice {

 public void pic() throws AWTException{
     WebDriver driver;

     //Proxy Setting     
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAssumeUntrustedCertificateIssuer(false);
        profile.setEnableNativeEvents(false);
        profile.setPreference("network.proxy.type", 1);
        profile.setPreference("network.proxy.http", "localHost");
        profile.setPreference("newtwork.proxy.http_port",3128);

        //Download setting
        profile.setPreference("browser.download.folderlist", 2);
        profile.setPreference("browser.helperapps.neverAsk.saveToDisk","jpeg");
        profile.setPreference("browser.download.dir", "C:\\Users\\Admin\\Desktop\\ScreenShot\\pic.jpeg");
        driver = new FirefoxDriver(profile);

        driver.navigate().to("http://stackoverflow.com/users/2675355/shantanu");
        driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"));
        Actions action = new Actions(driver);
        action.moveToElement(driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"))).perform();
        action.contextClick().perform();
        Robot robo = new Robot();
        robo.keyPress(KeyEvent.VK_V);
        robo.keyRelease(KeyEvent.VK_V);
    // Here I am getting the os window but don't know how to send the desired location
    }//method   
}//class

Pour chrome- 

public class practice {
   public void s() throws AWTException{
        WebDriver driver;   
        System.setProperty("webdriver.chrome.driver","C:\\Users\\Admin\\Desktop\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.navigate().to("http://stackoverflow.com/users/2675355/shantanu");
        driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"));
        Actions action = new Actions(driver);
        action.moveToElement(driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"))).perform();
        action.contextClick().perform();
        Robot robo = new Robot();
        robo.keyPress(KeyEvent.VK_V);
        robo.keyRelease(KeyEvent.VK_V);
        // Here I am getting the os window but don't know how to send the desired location
   }
 }

This is the pop up window where I am stuck

17
Shantanu Nandan

Il y a deux choses qui ne vont pas dans le code. 

Pour Firefox: Vous devez définir 

profile.setPreference("browser.download.dir", "C:\\Users\\Admin\\Desktop\\ScreenShot\\");

ne pas 

profile.setPreference("browser.download.dir", "C:\\Users\\Admin\\Desktop\\ScreenShot\\pic.jpeg");

deuxièmement, vous définissez préférence browser.download.folderlist , il s'agit de browser.download.folderList (L majuscule dans folderList).

Une fois que vous avez atteint cet objectif, vous pouvez utiliser ensuite votre classe Robot pour effectuer les opérations souhaitées.

Pour Chromedriver, essayez avec:

String downloadFilepath = "/path/to/download";
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);

J'espère que cela t'aides. :)

19
Vivek Singh

J'ai passé beaucoup de temps à chercher comment télécharger un fichier pdf dans le navigateur Firefox sans avoir l'apparence de Enregistrer sous. Il faut aider quelqu'un.

Après quelques recherches locales, comment télécharger pdf , fichier dans firefox sans aucune fenêtre Enregistrer sous, j'ai trouvé la préférence minimale requise dans le profil firefox:

profile.setPreference("pdfjs.disabled", true);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");

Bien sûr, vous pouvez ajouter des préférences supplémentaires.

Cela fonctionne dans les versions de Firefox 45-46.

2
Yury Staravoitau

Pour Navigateur Chrome :

Même vous pouvez désactiver le dialogue Windows (Enregistrer en tant que dialogue) avec l'extrait de code suivant. Vous devez définir les préférences suivantes dans chromedriver:

  • désactiver l'invite de téléchargement si elle apparaît
  • définir le répertoire par défaut pour télécharger le fichier
  • Si PDF view plugin est activé, ce qui ouvre le fichier PDF dans le navigateur, vous pouvez le désactiver pour que le téléchargement puisse démarrer automatiquement.
  • Accepter n'importe quel certificat dans le navigateur

    String downloadFilepath = "/path/to/download/directory/";
    Map<String, Object> preferences = new Hashtable<String, Object>();
    preferences.put("profile.default_content_settings.popups", 0);
    preferences.put("download.Prompt_for_download", "false");
    preferences.put("download.default_directory", downloadFilepath);
    
    // disable flash and the PDF viewer
    preferences.put("plugins.plugins_disabled", new String[]{
        "Adobe Flash Player", "Chrome PDF Viewer"});
    
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("prefs", preferences);
    
    DesiredCapabilities capabilities = DesiredCapabilities.chrome();
    capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
    capabilities.setCapability(ChromeOptions.CAPABILITY, options);
    driver = new ChromeDriver(capabilities);
    
2
Muhammad

Vous avez partiellement répondu à votre propre question:

le problème où je suis coincé est après avoir obtenu la fenêtre os

Selenium est un outil de navigation navigateur automation - os window n'est pas un navigateur! Vous devrez utiliser quelque chose d'autre. Il y a beaucoup de choix, selon vos besoins: Sikuli, Robot, AutoIt, ...

0
SiKing

Utilisez la même classe Robot et appuyez sur Entrée pour sélectionner "Enregistrer" dans la boîte de dialogue Windows.

robo.keyPress (KeyEvent.VK_ENTER); robo.keyRelease (KeyEvent.VK_ENTER);

si vous devez le renommer, copiez le nom du fichier dans le presse-papier et transmettez-le comme ci-dessous.

StringSelection file = new StringSelection("D:\\image.jpg");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(file, null);

Robot rb = new Robot();

rb.setAutoDelay(2000); // Similar to thread.sleep

rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);

rb.keyRelease(KeyEvent.VK_CONTROL);
rb.keyRelease(KeyEvent.VK_V);

rb.setAutoDelay(2000);

rb.keyPress(KeyEvent.VK_ENTER);
rb.keyRelease(KeyEvent.VK_ENTER);
0
Thirumaran

Pour Chrome, ça va marcher 

String downloadFilepath = "/path/to/download";
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);
WebDriver driver = new ChromeDriver(options);
0
Bachan Joseph

Ce n’est probablement pas la meilleure solution, mais vous pouvez essayer d’utiliser sikuli api pour confirmer la sauvegarde de la boîte affichée.

La zone Enregistrer sous est une fenêtre de système d'exploitation.

0
user1586480