如何在selenium Chrome功能中设置默认下载目录?

vin*_*007 17 java selenium selenium-chromedriver selenium-webdriver

请使用chrome功能查找以下代码.实际上,浏览器没有将文件下载到指定的路径.

private static DesiredCapabilities getChromeCapabilities() throws Exception {

    String chromePath = BrowserUtil.class.getResource("/Browserdrivers/chromedriver.exe").getPath();
    System.setProperty("webdriver.chrome.driver", chromePath);
    String downloadFilepath = "C:\\TestDownloads";
    ChromeOptions options = new ChromeOptions();
    HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
    chromePrefs.put("profile.default_content_settings.popups", 0);
    chromePrefs.put("download.default_directory", downloadFilepath);
    options.setExperimentalOption("prefs", chromePrefs);
    options.addArguments("--test-type");
    options.addArguments("start-maximized", "disable-popup-blocking");

    DesiredCapabilities chromeCapabilities = DesiredCapabilities.chrome();
    setProxy(chromeCapabilities);
    chromeCapabilities.setPlatform(Platform.WINDOWS);
    chromeCapabilities.setCapability("name", MDC.get("testname"));
    chromeCapabilities.setCapability(ChromeOptions.CAPABILITY, options);
    return chromeCapabilities;
}
Run Code Online (Sandbox Code Playgroud)

Shu*_*ain 32

对于Chromedriver试用:

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);
Run Code Online (Sandbox Code Playgroud)

注意: - 在Windows中,你需要使用\\作为路径,如果你使用的是linux或mac,那么使用//

希望这可以帮助.:)

  • 或者您只需使用File.separator而不是斜杠 (4认同)
  • 有没有办法在 **当前会话** 上更改下载路径,类似于单击 Chrome 设置 - &gt;下载的方式?我看到的答案总是会导致**构建新选项+新驱动程序+获得全新会话**。我不希望关闭当前会话,因为我的文件夹分隔基于下拉列表中的每个项目,并且不需要重新加载新页面。 (2认同)

Luk*_*uke 16

对于看到此页面的 Python 用户——这是我在 Python Selenium 中设置下载目录的方法(这只是 Shubham 接受的答案的 Python 版本):

def newChromeBrowser(headless=True, downloadPath=None):
    """ Helper function that creates a new Selenium browser """
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument('headless')
    if downloadPath is not None:
        prefs = {}
        os.makedirs(downloadPath)
        prefs["profile.default_content_settings.popups"]=0
        prefs["download.default_directory"]=downloadPath
        options.add_experimental_option("prefs", prefs)
    browser = webdriver.Chrome(options=options, executable_path=CHROMEDRIVER_PATH)
    return browser
Run Code Online (Sandbox Code Playgroud)

  • 我以此为我的 Python 代码的灵感并且运行良好。最后,它看起来像这样: path_dest = '//path/to/download/' prefs = {} prefs['profile.default_content_settings.popups']=0 prefs['download.default_directory']=path_dest options = Options () options.add_experimental_option('首选项',首选项) (3认同)

小智 9

ans帮助我在Windows上解决这个问题(https://bugs.chromium.org/p/chromedriver/issues/detail?id=783).

Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("download.default_directory",  System.getProperty("user.dir")+ File.separator + "externalFiles" + File.separator + "downloadFiles");
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
ChromeDriver driver = new ChromeDriver(options);
Run Code Online (Sandbox Code Playgroud)


sil*_*ver 7

2020 更新:

铬:v84

Chrome 驱动程序:v83

JDK:OpenJDK 11 (LTS)

使用Paths类作为独立于平台的文件分隔符。

@Test
public void doFileDownload() throws Throwable {
    // Since Java 7: Relative path from project root dir
    // Put in target dir to avoid committing downloaded files
    var downloadDir = Paths.get("target").toAbsolutePath().toString();

    var prefs = new HashMap<String, Object>();
    prefs.put("download.default_directory", downloadDir); // Bypass default download directory in Chrome
    prefs.put("safebrowsing.enabled", "false"); // Bypass warning message, keep file anyway (for .exe, .jar, etc.)
    var opts = new ChromeOptions();
    opts.setHeadless(true);
    opts.setExperimentalOption("prefs", prefs);

    var driver = new ChromeDriver(opts); // ChromeDriver binary is added to PATH env var
    driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    driver.manage().window().maximize();
    driver.get("https://the-internet.herokuapp.com/download");

    var downloadLink = driver.findElement(By.cssSelector("a[href*='some-file.txt']"));
    var downloadHref = downloadLink.getAttribute("href").replace(":", "");
    var downloadFileName = Paths.get(downloadHref).getFileName().toString();
    downloadLink.click();

    // Wait download to finish for 60s
    var downloadFilePath = Paths.get(downloadDir, downloadFileName);
    new WebDriverWait(driver, 60).until(d -> downloadFilePath.toFile().exists());

    // Since Java 11: Read content of downloaded file
    var content = Files.readString(downloadFilePath);

    // Do tests with string content...
    log.info("Content={}", content);

    driver.quit();
}
Run Code Online (Sandbox Code Playgroud)

输出:

输出

这样做mvn clean之前,任何运行也需要有覆盖现有文件的照顾。

pom.xml:

<properties>
    <!-- Remove encoding warnings -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>3.141.59</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.6.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

  • 一个很好的解决方案和答案。我不喜欢你如何坚持一些独特的“新”java 功能 - 可以为我们这些不允许更新的公司僵尸做一些事情:)但我想澄清:你已经为我和社区做了一些事情服务很棒!谢谢你! (2认同)
  • Java 7 已经是 10 年前的事了。这不是“新”的。解决你的问题的方法很简单 - 转到一家在过去 10 年内使用某种产品的公司。不客气! (2认同)