Chromium/Chrome无头 - 文件下载不起作用?

Taa*_*apo 17 headless chromium

我下载了最新版本的铬,以测试无头功能.

当我跑(作为根,因为我还在测试东西):

./chrome --no-sandbox http://cp7.awardspace.com/speed-test/awardspace-data1mb.zip
Run Code Online (Sandbox Code Playgroud)

在GUI终端中,它打开Chromium并下载文件.

如果我试图无头地运行它,我输入以下内容:

./chrome --no-sandbox --headless http://cp7.awardspace.com/speed-test/awardspace-data1mb.zip
Run Code Online (Sandbox Code Playgroud)

终端输出一些信息,没有窗口打开,但是:我没有在任何地方下载文件.

我一直在寻找互联网和讨论组以获取更多信息,但找不到任何东西.

文件下载是否在Chromium的无头模式下工作?

小智 13

这是无头实施中报告的错误:https://bugs.chromium.org/p/chromium/issues/detail? id = 696481


100*_*001 5

使用ChromeDriverService和POST会话/ {sessionId} / chromium / send_command

POST的JSON:

{
    "cmd": "Page.setDownloadBehavior",
    "params": {
        "behavior": "allow",
        "downloadPath": "C:\\Download\\Path"
    }
}
Run Code Online (Sandbox Code Playgroud)

C#解决方案

添加对System.Net.Http的引用,并使用NuGet安装Newtonsoft.JSON。

public static IWebDriver Driver { get; private set; }

public void SetDriver()
{
    var chromeOptions = new ChromeOptions();
    chromeOptions.AddArguments("--headless", "--window-size=1920,1080");

    var driverService = ChromeDriverService.CreateDefaultService();
    Driver = new ChromeDriver(driverService, chromeOptions);

    Task.Run(() => AllowHeadlessDownload(driverService));
}

static async Task AllowHeadlessDownload(ChromeDriverService driverService )
{
    var jsonContent = new JObject(
        new JProperty("cmd", "Page.setDownloadBehavior"),
        new JProperty("params",
        new JObject(new JObject(
            new JProperty("behavior", "allow"),
            new JProperty("downloadPath", @"C:\Download\Path")))));
    var content = new StringContent(jsonContent.ToString(), Encoding.UTF8, "application/json");
    var sessionIdProperty = typeof(ChromeDriver).GetProperty("SessionId");
    var sessionId = sessionIdProperty.GetValue(Driver, null) as SessionId;

    using (var client = new HttpClient())
    {
        client.BaseAddress = driverService.ServiceUrl;
        var result = await client.PostAsync("session/" + sessionId.ToString() + "/chromium/send_command", content);
        var resultContent = await result.Content.ReadAsStringAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)