web-dev-qa-db-fra.com

Comment télécharger un fichier et l'enregistrer à l'emplacement souhaité à l'aide de Selenium Webdriver

Je dois effectuer la tâche suivante à l'aide de Selenium Webdriver indiqué ci-dessous.

  1. Cliquez sur n'importe quel lien/bouton qui commence à télécharger un fichier (le type de fichier peut être n'importe quoi: image, pdf, jar, etc.)
  2. Cliquez sur "Enregistrer" dans la fenêtre contextuelle si elle apparaît (par exemple, dans le cas de http://Selenium.googlecode.com/files/Selenium-server-standalone-2.33.0.jar )
  3. Indiquez l'emplacement souhaité pour enregistrer ce fichier.

Quelqu'un peut-il partager, comment pouvons-nous implémenter cela en utilisant Java?

27
Sankumarsingh

Vous ne pourrez pas accéder à la boîte de dialogue de sauvegarde. C'est contrôlé par l'OS. La seule chose que vous allez vraiment pouvoir faire est de définir l’emplacement de téléchargement par défaut du navigateur et de lui permettre de télécharger automatiquement les fichiers. Puis vérifiez le fichier en Java.

Vous devriez vérifier cette réponse de cette précédente SO question . En règle générale, lors de la configuration de votre profil Firefox, vous ajoutez un appel pour définir la propriété browser.helperApps.neverAsk.saveToDisk sur une liste de types MIME séparés par des virgules, afin qu'ils soient toujours téléchargés:

firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

Voir cet article FAQ de Mozilla KB à propos de: configs.

UPDATE Il semble que cela soit maintenant possible voir cette réponse dans une autre question

22
Dirk

La boîte de dialogue Annuler/Enregistrer peut s’afficher car le site vous envoie un type MIME différent.

Vérifiez le contenu de l'en-tête. 

À l'aide des outils de développement intégrés à Firefox, faites un clic droit pour inspecter le lien élément/téléchargement de votre publication, puis consultez le Moniteur réseau pour voir la valeur d'en-tête ContentType renvoyée. Ce serait celui que vous souhaitez utiliser. 

 enter image description here

Définissez vos paramètres de profil en conséquence

 firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
                     "application/octet-stream,text/csv");

Je m'attendais à "text/csv", mais j'ai obtenu "application/octet-stream" Une fois ajouté à la liste des types acceptés, tout a fonctionné comme prévu, No popups

8
Abelgo

Une solution potentielle consiste à obtenir l'URL du fichier via Selenium, à créer une connexion (non-Selenium), à copier les cookies de Selenium sur la connexion (si nécessaire) et à télécharger le fichier. La plupart des langages ont des API (ou bibliothèques) pour exécuter des requêtes HTTP. Par exemple, pour accomplir cela en Java, vous pouvez utiliser URL.openConnection() :

String link = linkElement.getAttribute("href");
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");

Vous devrez peut-être copier les cookies présents sur Selenium pour imiter l'utilisateur Selenium (par exemple, si vous testez un site Web nécessitant une connexion).

Set<Cookie> cookies = webDriver.manager().getCookies();
String cookieString = "";

for (Cookie cookie : cookies) {
    cookieString += cookie.getName() + "=" + cookie.getValue() + ";";
}

httpURLConnection.addRequestProperty("Cookie", cookieString);

Ensuite, vous pouvez utiliser HttpURLConnection.getInputStream() pour écrire le contenu du fichier à l’emplacement de votre choix.

try (InputStream in = httpURLConnection.getInputStream()) {
    Files.copy(in, new File("/path/to/file.ext").toPath(),
        StandardCopyOption.REPLACE_EXISTING);
}

Bien que cette méthode soit différente pour différents langages de programmation, cela fonctionne de la même manière pour tous les navigateurs.

3
stiemannkj1

Je pense que tu cherches quelque chose comme ça

//common to all the cases
FirefoxProfile prof = new FirefoxProfile();

//Case:1 - Use this case to set download this code to your browser's default location
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/Zip");

//Case:2 - Download file to Desktop
//prof.setPreference("browser.download.folderList", 0);
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/Zip");

//Case:3 - Download to custom folder path. Replace d:\\Selenium with your Download Location 
prof.setPreference("browser.download.dir","D:\\Selenium\\");
prof.setPreference("browser.download.folderList", 2);
prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/Zip");

//This will work for all cases mentioned above
WebDriver driver = new FirefoxDriver(prof);
driver.get("http://docs.seleniumhq.org/download/");
driver.findElement(By.xpath("//tr[1]/td[4]/a[text()='Download']")).click();
1
Deepak gupta

Si vous utilisez Java et Chromdriver, j'ai développé une bibliothèque qui devrait faciliter vos téléchargements. 

Parmi ses fonctionnalités, vous pouvez définir votre répertoire de téléchargement dans une ligne de code et vérifier que votre fichier a été téléchargé avec succès:

@Test
void downloadAttachTest() throws InterruptedException {
    adamInternetPage.navigateToPage(driver);
    seleniumDownloadKPI.fileDownloadKPI(
            adamInternetPage.getFileDownloadLink(), "SpeedTest_16MB.dat");
    waitBeforeClosingBrowser();
}
0
AutomatedOwl

Vous pouvez utiliser le code ci-dessous pour enregistrer le fichier à l'emplacement requis.

package popups;

import Java.util.concurrent.TimeUnit;

import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.firefox.FirefoxDriver;
import org.openqa.Selenium.firefox.FirefoxOptions;
import org.openqa.Selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class FileDownloadPopup 
{
    WebDriver driver;
    FirefoxProfile prof = new FirefoxProfile();
    FirefoxOptions options = new FirefoxOptions();

    @BeforeMethod
    public void setEnvi() 
    {
        System.setProperty("webdriver.gecko.driver", "E:\\Selenium Dependencies\\BrowserExecutables\\geckodriver_win64_v0.21.0.exe");
        prof.setPreference("browser.download.dir","E:\\Downloads");
        prof.setPreference("browser.download.folderList", 2);
        prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        options.setProfile(prof);
        driver = new FirefoxDriver(options);
        driver.get("http://file-examples.com/index.php/sample-documents-download/sample-xls-download/");
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }

    @Test
    public void FDPP()
    {
        driver.findElement(By.xpath("(//a[text()='Download sample xlsx file'])[1]")).click();
    }

    @AfterMethod
    public void closeEnvi()
    {
        driver.close();
    }

}
0
Madhusudan