使用Selenium WebDriver for Firefox下载pdf

时间:2017-09-26 21:17:03

标签: java selenium pdf firefox

我正在尝试将.pdf下载到我的本地,以便我可以使用Apache PDFBox从中读取文本并将其验证为我的测试套件的一部分。我已经找到了一些代码,可以通过点击URL从Firefox下载pdf。这对我不起作用,因为我正在使用的pdf是一个机密文档,因此它不会被URL公开,而是作为弹出窗口加载到PDF Viewer中。在浏览器中加载PDF Viewer后,有谁知道如何点击Firefox PDF Viewer中的下载按钮?

enter image description here

我试过通过元素的ID查找它="下载":

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

不幸的是,这不起作用,因为它说它找不到元素。有人知道解决方法吗?

更新:我描述的弹出窗口是iframe元素。这导致无法找到"下载"元件。使用@ 4M01的switchTo()回答固定。

4 个答案:

答案 0 :(得分:1)

如你所说,

  

在PDF Viewer中作为弹出窗口加载

您需要使用驱动程序对象的switchTo()方法处理不同窗口之间的切换。

下面的代码工作正常,没有问题,我可以点击下载图标。

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();
    }

}

答案 1 :(得分:1)

只需使用以下代码点击下载按钮:

    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);

答案 2 :(得分:1)

我们可以使用Firefox浏览器设置和使用WebDriver的Firefox Profile设置在Firefox浏览器中处理下载弹出窗口。

步骤1:在Firefox浏览器中更新设置。

打开Firefox浏览器并导航到工具 - >选项 导航到应用程序。 将Action类型设置为PDF的“保存文件”。

第2步:使用FirefoxProfile初始化FireFoxDriver

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);

第3步:执行脚本

执行点击下载PDF图标的脚本。

结果:将下载PDF文件,并且不会显示“下载”弹出窗口。

答案 3 :(得分:0)

您可以使用以下(C#)代码处理下载图标(使用Firefox):

IWebElement element = Driver.FindElement(By.Id("download"));
IJavaScriptExecutor executor = (IJavaScriptExecutor)Driver;
executor.ExecuteScript("arguments[0].click();", element);