web-dev-qa-db-fra.com

Chrome/Chrome sans tête - le téléchargement du fichier ne fonctionne pas?

J'ai téléchargé la dernière version de chrome pour tester la fonctionnalité sans tête.

Quand je cours (en tant que root, car je teste toujours des choses):

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

Dans le terminal graphique, il ouvre Chromium et télécharge le fichier.

Si j'essaye de l'exécuter sans tête, j'entre ce qui suit:

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

Le terminal affiche des informations, aucune fenêtre ne s'ouvre, mais aussi: le fichier n'est téléchargé nulle part.

J'ai cherché Internet et des groupes de discussion pour plus d'informations, mais je ne trouve rien.

Le téléchargement de fichier ne fonctionne-t-il pas en mode sans tête pour Chromium?

15
Taapo

C'est un bug signalé dans une implémentation sans tête: https://bugs.chromium.org/p/chromium/issues/detail?id=696481

12
Bartosz

En Java, utilisez le code suivant:

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

Utiliser ChromeDriverService et POST session/{sessionId}/chromium/send_command

JSON pour POST:

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

Solution C #

Ajoutez une référence à System.Net.Http et utilisez NuGet pour installer 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();
    }
}
2
1001001001

J'ai pu télécharger des fichiers sans chrome sans tête grâce à l'interface à distance Chrome

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

Le code complet d'intégration avec Selenium est disponible ici https://github.com/cezarypiatek/Tellurium/blob/master/Src/MvcPages/SeleniumUtils/ChromeRemoteInterface/ChromeRemoteInterface.cs

Plus d'informations sur les interfaces setDownloadBehavior et Chrome Remote https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-setDownloadBehavior

0
cezarypiatek

Remarque: pas exactement répondre à la question, mais résout le problème

J'ai fait beaucoup de recherches sur le téléchargement sans tête de chrome avec différents paramètres/options/préférences, mais rien n'a fonctionné. Ensuite, j'ai utilisé une méthode de téléchargement de fichier Java standard à l'aide de FileUtils d'Apache Commons. 

FileUtils.copyURLToFile(URI, FILE);
0
Apurv