web-dev-qa-db-ger.com

Chromium/Chrome headless - Dateidownload funktioniert nicht?

Ich habe die neueste Version von Chrom heruntergeladen, um die kopflose Funktion zu testen.

Wenn ich renne (als root, weil ich immer noch Dinge teste):

./chrome --no-sandbox http://cp7.awardspace.com/speed-test/awardspace-data1mb.Zip

Im GUI-Terminal wird Chromium geöffnet und die Datei heruntergeladen.

Wenn ich versuche, es kopflos auszuführen, gebe ich Folgendes ein:

./chrome --no-sandbox --headless http://cp7.awardspace.com/speed-test/awardspace-data1mb.Zip

Das Terminal gibt Informationen aus, kein Fenster wird geöffnet, aber auch: Ich habe die Datei nirgendwo heruntergeladen.

Ich habe im Internet und in Diskussionsgruppen nach weiteren Informationen gesucht, kann aber nichts finden.

Funktioniert das Herunterladen von Dateien nicht für Chromium im Headless-Modus?

15
Taapo

Dies ist ein gemeldeter Fehler in der Headless-Implementierung: https://bugs.chromium.org/p/chromium/issues/detail?id=696481

12
Bartosz

Verwenden Sie in Java folgenden Code:

System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
         ChromeOptions options = new ChromeOptions();
                options.addArguments("--test-type");
                options.addArguments("--headless");
                options.addArguments("--disable-extensions"); //to disable browser extension popup

                ChromeDriverService driverService = ChromeDriverService.createDefaultService();
                ChromeDriver driver = new ChromeDriver(driverService, options);

                Map<String, Object> commandParams = new HashMap<>();
                commandParams.put("cmd", "Page.setDownloadBehavior");
                Map<String, String> params = new HashMap<>();
                params.put("behavior", "allow");
                params.put("downloadPath", "//home//vaibhav//Desktop");
                commandParams.put("params", params);
                ObjectMapper objectMapper = new ObjectMapper();
                HttpClient httpClient = HttpClientBuilder.create().build();
                String command = objectMapper.writeValueAsString(commandParams);
                String u = driverService.getUrl().toString() + "/session/" + driver.getSessionId() + "/chromium/send_command";
                HttpPost request = new HttpPost(u);
                request.addHeader("content-type", "application/json");
                request.setEntity(new StringEntity(command));
                httpClient.execute(request);
        driver.get("http://www.seleniumhq.org/download/");
        driver.findElement(By.linkText("32 bit Windows IE")).click();
4
Vaibhav Sharma

Verwenden Sie ChromeDriverService und POST session/{sessionId}/chromium/send_command

JSON für POST:

{
    "cmd": "Page.setDownloadBehavior",
    "params": {
        "behavior": "allow",
        "downloadPath": "C:\\Download\\Path"
    }
}

C # -Lösung

Fügen Sie einen Verweis auf System.Net.Http hinzu, und verwenden Sie NuGet, um Newtonsoft.JSON zu installieren.

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

Der folgende Code funktioniert in C # mit ChromeDriver 2.46

    private ChromeDriver GetDriver()
    {
        var options = new ChromeOptions();

        options.AddArguments("headless");
        options.AddUserProfilePreference("download.Prompt_for_download", "false");
        options.AddUserProfilePreference("download.directory_upgrade", "true");
        options.AddUserProfilePreference("download.Prompt_for_download", "false");
        options.AddUserProfilePreference("safebrowsing.enabled", "false");
        options.AddUserProfilePreference("safebrowsing.disable_download_protection", "true");

        options.AddArguments("--disable-web-security");

        var curr = Directory.GetCurrentDirectory();
        options.AddUserProfilePreference("download.default_directory", curr);

        var driver = new ChromeDriver(options);
        Log.Info($"Started Chrome Driver with options: {options.ToJsonNoTypes()}");

        var param = new Dictionary<string, object>();
        param.Add("behavior", "allow");
        param.Add("downloadPath", curr);
        driver.ExecuteChromeCommand("Page.setDownloadBehavior", param);

        return driver;
    }
1
Daniel Williams

Dank Chrome Remote Interface konnte ich Dateien mit Chrome Headless herunterladen

public void TryEnableFileDownloading(string downloadPath)
{
    TrySendCommand("Page.setDownloadBehavior", new Dictionary<string, object>()
    {
        ["behavior"] = "allow",
        ["downloadPath"] = downloadPath
    });
}

Den vollständigen Code für die Integration mit Selenium finden Sie hier https://github.com/cezarypiatek/Tellurium/blob/master/Src/MvcPages/SeleniumUtils/ChromeRemoteInterface/ChromeRemoteInterface.cs

Weitere Informationen zur setDownloadBehavior- und Chrome Remote-Schnittstelle https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-setDownloadBehavior

0
cezarypiatek

Hinweis: Die Frage ist nicht genau zu beantworten, löst aber das Problem

Ich habe viel darüber nachgedacht, wie man Headless Chrome mit verschiedenen Parametern/Optionen/Präferenzen herunterladen kann, aber nichts hat funktioniert. Dann habe ich die Java-Standardmethode zum Herunterladen von Dateien mit den FileUtils von Apache Commons verwendet 

FileUtils.copyURLToFile(URI, FILE);
0
Apurv