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

Java 如何在selenium Chrome功能中设置默认下载目录?,java,selenium,selenium-webdriver,selenium-chromedriver,Java,Selenium,Selenium Webdriver,Selenium Chromedriver,请查找以下具有chrome功能的代码。实际上,浏览器并没有将文件下载到指定的路径 private static DesiredCapabilities getChromeCapabilities() throws Exception { String chromePath = BrowserUtil.class.getResource("/Browserdrivers/chromedriver.exe").getPath(); System.setProperty("webdr

请查找以下具有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;
}
私有静态DesiredCapabilities getChromeCapabilities()引发异常{
字符串chromePath=BrowserUtil.class.getResource(“/Browserdrivers/chromedriver.exe”).getPath();
System.setProperty(“webdriver.chrome.driver”,chromePath);
String downloadFilepath=“C:\\TestDownloads”;
ChromeOptions选项=新的ChromeOptions();
HashMap chromePrefs=新HashMap();
chromePrefs.put(“profile.default\u content\u settings.popups”,0);
chromePrefs.put(“download.default\u目录”,downloadFilepath);
选项。设置实验选项(“prefs”,chromePrefs);
options.addArguments(“--test type”);
addArguments(“启动最大化”、“禁用弹出窗口阻止”);
DesiredCapabilities chromeCapabilities=DesiredCapabilities.chrome();
setProxy(色度能力);
chromecabilities.setPlatform(Platform.WINDOWS);
chromecabilities.setCapability(“name”,MDC.get(“testname”);
色度能力。设置能力(色度选项。能力,选项);
返回色度能力;
}

对于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);
String downloadFilepath=“/path/to/download”;
HashMap chromePrefs=新HashMap();
chromePrefs.put(“profile.default\u content\u settings.popups”,0);
chromePrefs.put(“download.default\u目录”,downloadFilepath);
ChromeOptions选项=新的ChromeOptions();
选项。设置实验选项(“prefs”,chromePrefs);
DesiredCapabilities=DesiredCapabilities.chrome();
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS,true);
上限设置能力(色度选项、能力、选项);
WebDriver=新的ChromeDriver(cap);
注意:-在windows中,如果使用linux或mac,则需要使用\\作为路径,然后使用//


希望这有帮助。:)

帮助我在Windows上解决此问题的答案:()

Map prefs=new HashMap();
prefs.put(“download.default_目录”、System.getProperty(“user.dir”)+File.separator+“externalFiles”+File.separator+“downloadFiles”);
ChromeOptions选项=新的ChromeOptions();
选项。设置实验选项(“prefs”,prefs);
ChromeDriver驱动程序=新的ChromeDriver(选项);

为了让它更干净、更简单,我开发了一个ChromeOptions对象,它可以让你生成一个ChromeOptions对象,其中一行包含你的下载文件夹。例如,要定义“/tmp/downloads”,请使用:


还包含允许接收下载KPI和执行断言的方法。

对于Chrome驱动程序,以下代码适用于我

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);
WebDriver driver = new ChromeDriver(options);
String downloadFilepath=“/path/to/download”;
HashMap chromePrefs=新HashMap();
chromePrefs.put(“profile.default\u content\u settings.popups”,0);
chromePrefs.put(“download.default\u目录”,downloadFilepath);
ChromeOptions选项=新的ChromeOptions();
选项。设置实验选项(“prefs”,chromePrefs);
WebDriver=新的ChromeDriver(选项);

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

2020年更新: 铬:v84

色度驱动器:v83

JDK:OpenJDK 11(LTS)

将类用于独立于平台的文件分隔符

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

或者您只需使用File.separator而不是slashes,若我需要在运行时更改下载路径,该怎么办?我的意思是为每个测试设置自己的路径。或者您可以使用System.IO.path.Combine,它将根据不同的测试添加适当的分隔符OS@ShubhamJain当我尝试在chrome中使用无头浏览器时。我看它不起作用。有什么线索吗?在当前会话中,有没有类似于单击Chrome设置->下载的方法来更改下载路径?我看到的答案总是需要构建新选项+新驱动程序+获得一个全新的会话。我不希望关闭当前会话,因为我的文件夹是基于下拉列表中的每个项目进行分离的,不需要重新加载新页面。我将此作为Python代码的灵感,效果很好。最后,它看起来是这样的:path\u dest='//path/to/download/'prefs={}prefs['profile.default\u content\u settings.popups']=0 prefs['download.default\u directory']=path\u dest options=options()options.add\u option('prefs',prefs)非常感谢。这应该是公认的答案(对于python)。如果目标目录已经存在,os.makedirs命令可能会失败,解决方法是:os.makedirs(downloadPath,exist\u ok=True)是一个很好的解决方案和答案。我不喜欢你坚持使用一些专门的“新”java功能——本可以为不允许更新的美国公司僵尸做一些事情:)但我想明确一点:你为我和社区做了伟大的服务!非常感谢。Java7是10年前的事了。它不是“新的”。解决问题的方法很简单——去一家在过去10年内使用过某种产品的公司。不客气!啊,对不起,我只看了“prefs”部分(因为我已经有了自己的系统来将文件传输到需要的地方),没有看到“自Java7”的注释。。。在某些方面,在一个平庸的群体中,最好是最聪明的人,而不是和你这样的鲨鱼一起在深水中游泳我钦佩他的诚实在某些方面,我也做了同样的事情,我的技能更接近于开发人员的水平(而且我很确定我可以做到),但我走的是一条比较少的道路,以领先于竞争对手。现在,“rockstar”开发人员被困在我的祖国,我在澳大利亚得到了一份工作。对于那些使用Windows的人来说,需要注意的是:“download.default\u directory”字符串必须使用反斜杠(\),而不是普通的斜杠(/)。
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);
WebDriver driver = new ChromeDriver(options);
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
@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();
}
<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>