2017-09-26 2 views
2

J'essaie de télécharger un fichier .pdf dans ma section locale pour que je puisse utiliser Apache PDFBox pour en lire le texte et le vérifier dans le cadre de ma suite de tests. J'ai déjà trouvé du code pour télécharger le pdf de Firefox en cliquant sur une URL. Cela ne fonctionne pas pour moi puisque le pdf avec lequel je travaille est un document confidentiel donc il n'est pas exposé par une URL, à la place chargé dans PDF Viewer comme une fenêtre contextuelle. Est-ce que quelqu'un sait comment cliquer sur le bouton de téléchargement dans Firefox PDF Viewer après avoir chargé le PDF Viewer dans le navigateur?Téléchargement de pdf avec Selenium WebDriver pour Firefox

enter image description here

J'ai essayé de regarder vers le haut par l'identifiant de l'élément = « télécharger »:

(new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("download"))); 
driver.findElement(By.id("download")).click(); 

Malheureusement, cela ne fonctionne pas comme il est dit qu'il ne peut pas trouver l'élément. Quelqu'un sait-il une solution de contournement?

MISE À JOUR: La fenêtre contextuelle que j'ai décrite était un élément iframe. Cela a provoqué l'impossibilité de trouver l'élément "download". Correction de la réponse switchTo() de @ 4M01.

Répondre

1

Comme vous l'avez mentionné,

à la place chargée dans PDF Viewer comme une fenêtre pop-up

Vous devez gérer la commutation entre les différentes fenêtres à l'aide de la méthode switchTo() de l'objet conducteur. Ci-dessous le code fonctionne très bien pour moi sans problème et je suis capable de cliquer sur l'icône de téléchargement.

public class FirefoxPDFTest { 
     WebDriver driver; 

    @BeforeClass 
    void Setup(){ 
     System.setProperty("webdriver.gecko.driver", "C:\\Automation\\Selenium\\drivers\\geckodriver.exe"); 
     driver = new FirefoxDriver(); 
     driver.manage().window().maximize(); 
    } 

    @Test 
    void downloadPDF(){ 
     driver.get("http://www.pdf995.com/samples/pdf.pdf"); 
     waitTillPageLoad(); 
     driver.findElement(By.id("download")).click(); 
    } 



    private void waitTillPageLoad(){ 
     new WebDriverWait(driver, 30).until(driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete")); 
    } 


    @AfterClass 
    void tearDown(){ 
     driver.close(); 
     driver.quit(); 
    } 

} 
+0

J'ai compris que, dans votre cas, vous devez d'abord basculer() sur le navigateur pop-up, puis cliquer sur l'icône de téléchargement présente dans le navigateur Firefox. Même après avoir fait ce PDF ne serait pas téléchargé tout de suite. Vous devez faire un réglage qui vous aidera à télécharger le PDF directement.Ces paramètres sont mentionnés par @zsbappa. – Amol

+0

Également votre question était, Selenium lançait une exception parce que l'élément n'a pas été trouvé. En fait, il n'y a pas de difficultés à trouver l'élément *, mais vous n'avez pas basculé dans la fenêtre contextuelle où votre document confidentiel a été ouvert. – Amol

+1

Désolé, j'ai supprimé mon commentaire quand j'ai réalisé. Votre réponse a résolu mon problème merci! J'ai créé un Robot (java.awt) pour appuyer sur le bouton OK après avoir demandé si je voulais enregistrer ou ouvrir un fichier, mais cela a fonctionné comme un charme. Je devais m'assurer de switchTo.defaultContent() après aussi. Je pense que je n'aurais pas à créer le robot en changeant la préférence "browser.helperApps.neverAsk.saveToDisk". –

1

utiliser simplement le code ci-dessous pour avoir cliqué sur le bouton de téléchargement:

driver.findElement(By.xpath("//button[@id='download']")).click(); 

    Thread.sleep(8000); 

    Robot robot = new Robot(); 

    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
+0

Malheureusement, il ne peut pas trouverElement directement comme vous le suggérez. La raison en est qu'il ne trouve pas l'élément "download" (par id ni xpath) parce qu'il se trouvait dans un iframe. Je devais driver.switchTo(). Frame ("nameOfMyFrame") et ensuite driver.switchTo(). DefaultContent(), après que j'ai été fait. Donc, cette stratégie findElement ne fonctionne pas pour mon cas. Bien que le truc Robot a bien fonctionné, merci! –

1

Nous pouvons gérer le menu contextuel de téléchargement dans le navigateur Firefox en utilisant les paramètres du navigateur Firefox et Firefox profil via WebDriver.

Étape 1: mettez à jour le paramètre dans le navigateur Firefox.

Ouvrez le navigateur Firefox et naviguez jusqu'à Outils -> Options Accédez à Applications. Définissez le type d'action sur "Enregistrer le fichier" pour PDF.

Étape 2: Initialiser FireFoxDriver utilisant FirefoxProfile

File downloadsDir = new File(""); 

// Set Preferences for FirefoxProfile. 
FirefoxProfile profile = new FirefoxProfile(); 
profile.setPreference("browser.download.folderList", 2); 
profile.setPreference("browser.download.dir", downloadsDir.getAbsolutePath()); 
profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", 
     "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream"); 
profile.setPreference("browser.download.manager.showWhenStarting", false); 
profile.setPreference("browser.download.manager.focusWhenStarting", false); 
profile.setPreference("browser.download.useDownloadDir", true); 
profile.setPreference("browser.helperApps.alwaysAsk.force", false); 
profile.setPreference("browser.download.manager.alertOnEXEOpen", false); 
profile.setPreference("browser.download.manager.closeWhenDone", true); 
profile.setPreference("browser.download.manager.showAlertOnComplete", false); 
profile.setPreference("browser.download.manager.useWindow", false); 
profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false); 
profile.setPreference("pdfjs.disabled", true); 

// Initialize the FireFoxDriver instance. 
FirefoxDriver webDriver = new FirefoxDriver(profile); 

Étape 3: Exécutez le script

Exécuter le script qui clique sur l'icône de téléchargement PDF.

Résultat: le fichier PDF sera téléchargé et la fenêtre de téléchargement ne sera pas affichée.

+0

Pour l'étape 1, j'essaye de réaliser ceci automatiquement dans le code de java au lieu de manuellement. Est-ce possible? Mon [recherche] (https://stackoverflow.com/questions/12146403/disable-firefox-save-as-dialog-selenium) dit que vous devriez être capable de changer cela avec votre "browser.helperApps.neverAsk.saveToDisk" méthode setPreference appeler mais cela ne semble pas fonctionner. –

+0

Appliquer le code espérons que vous n'avez pas besoin de définir manuellement ... – zsbappa

+0

N'oubliez pas d'accepter la réponse si elle vous aide – zsbappa