如何使用GeckoDriver、Firefox和Selenium下载文件?

5

我使用了这个代码来下载文件,但它不起作用。

FirefoxProfile profile = new FirefoxProfile();

profile.setPreference("browser.download.dir","D:\\WebDriverDownloads");
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;"); 
profile.setPreference( "browser.download.manager.showWhenStarting",false );
profile.setPreference( "pdfjs.disabled",true );


FirefoxDriver driver = new FirefoxDriver(profile);  //Shows error on this line

driver.get("http://toolsqa.com/automation-practice-form/");

driver.findElement(By.linkText("Test File to Download")).click();

Thread.sleep(5000);

它给了我一个错误

错误信息

当我从这个 FirefoxDriver driver = new FirefoxDriver(profile); 代码中删除

'Profile'

之后,代码成功运行,但下载文件的窗口没有关闭且文件也没有下载。

相反,我使用了 Robot。

Robot object=new Robot();
object.keyPress(KeyEvent.VK_DOWN);
object.keyRelease(KeyEvent.VK_DOWN);         
object.keyPress(KeyEvent.VK_ENTER);
object.keyRelease(KeyEvent.VK_ENTER);

我的代码没问题,为什么上面的代码不起作用呢?


@DebanjanB 它给出了与图像中显示的相同的错误消息,在这段代码中也有 WebDriver driver = new FirefoxDriver(profile); 这一行,因此它显示错误。 - Pradnya Bolli
1个回答

3

要下载文件并点击文本为“Test File to Download”链接,您需要执行以下操作:

  • Create a new FirefoxProfile() and set the required preferences.
  • Use an instance of FirefoxOptions() set the profile.
  • You can use the following solution:

    System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("browser.download.dir", "C:\\Utility\\Downloads");
    profile.setPreference("browser.download.folderList",2);
    profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    profile.setPreference("browser.download.manager.showWhenStarting", false);
    profile.setPreference("browser.helperApps.neverAsk.openFile","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    profile.setPreference("browser.helperApps.alwaysAsk.force", false);
    profile.setPreference("browser.download.manager.useWindow", false);
    profile.setPreference("browser.download.manager.focusWhenStarting", false);
    profile.setPreference("browser.download.manager.showAlertOnComplete", false);
    profile.setPreference("browser.download.manager.closeWhenDone", true);
    FirefoxOptions options = new FirefoxOptions();
    options.setProfile(profile);
    WebDriver driver = new FirefoxDriver(options);
    driver.get("http://toolsqa.com/automation-practice-form/");
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Test File to Download"))).click();
    

1
谢谢你的解决方案!!!它有效了...但是你能给一点关于代码的解释吗? - Pradnya Bolli
我们刚刚添加了所需的偏好设置,以便通过FirefoxProfile不显示下载弹出窗口,并将其嵌入到FirefoxOptions()实例中,然后将其传递给FirefoxDriver(options)构造函数。是的,根据最佳实践,您需要使用WebDriverWait来等待所需的elementToBeClickable()。您想让我解释哪一行吗? - undetected Selenium
感谢您的解释...我们使用了 profile.setPreference("browser.helperApps.neverAsk.openFile", ""); 这行代码,所以它没有显示保存窗口? - Pradnya Bolli
现在已经更正了,这个属性应该被赋予一个布尔值 true - undetected Selenium
@DanielZiltener 这是我的错,现已更正,请告知状态。 - undetected Selenium
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接