Chromium/Chrome headless - загрузка файла не работает?

Я загрузил последнюю версию хрома, чтобы проверить функцию безголоса.

Когда я запускаю (как root, потому что я все еще проверяю вещи):

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

В терминале GUI он открывает Chromium и загружает файл.

Если я пытаюсь запустить его без головы, я ввожу следующее:

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

Терминал выводит некоторую информацию, окно не открывается, но также: у меня нет файла, загруженного в любом месте.

Я изучал интернет и дискуссионные группы для получения дополнительной информации, но ничего не могу найти.

Не загружена ли загрузка файлов в режиме безглавых для Chromium?

Ответ 2

В Java используйте следующий код:

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

Ответ 3

Используйте ChromeDriverService и сеанс POST/{sessionId}/chromium/send_command

JSON для POST:

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

Решение С#

Добавьте ссылку на 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();
    }
}

Ответ 4

Следующий код работает в С# с использованием 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;
    }

Ответ 5

Примечание. Не совсем ответьте на вопрос, но решает проблему.

Я много разбирался в создании безгласного хромового скачивания с различными параметрами/параметрами/предпочтениями, но ничего не работало. Затем я использовал стандартный способ загрузки Java с помощью Apache Commons FileUtils

FileUtils.copyURLToFile(URI, FILE);

Ответ 6

Мне удалось загрузить файлы с хромовым безголовым благодаря удаленному интерфейсу Chrome

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

Полный код для интеграции с селеном можно найти здесь https://github.com/cezarypiatek/Tellurium/blob/master/Src/MvcPages/SeleniumUtils/ChromeRemoteInterface/ChromeRemoteInterface.cs

Дополнительная информация о setDownloadBehavior и интерфейсе Chrome Remote https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-setDownloadBehavior

Ответ 7

Я пытался с тем же кодом, но он не работает, когда я пытаюсь нажать кнопку загрузки, она нажимает хорошо, я вижу кнопку, выбранную на скриншоте, но нет загруженного PDF, она работает нормально в обычном режиме Chrome.

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

Ответ 8

Я попробовал сегодня в редакторе IdeaJ, Java и Maven на Windows 10, и он работает нормально:

                ChromeOptions ds = getDesiredCapabilities(browserName);

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

                Map<String, Object> commandParams = new HashMap<>();
                commandParams.put("cmd", "Page.setDownloadBehavior");

                Map<String, String> params = new HashMap<>();
                params.put("behavior", "allow");
                params.put("downloadPath", System.getProperty("user.home") + File.separator + "Downloads");
                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);

Используйте этот настроенный экземпляр "драйвера" для навигации по загрузке файла либо по URL, либо по действию загрузки Json/AngularJs. Кроме того, иногда это приводило к повреждению файла во время загрузки из-за медленной работы интернета.

Более подробно об этом, одна и та же конфигурация будет работать как для пользовательского интерфейса Google Chrome, так и для исполнения без головы в последней версии драйвера Chrome