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?
C'est un bug signalé dans une implémentation sans tête: https://bugs.chromium.org/p/chromium/issues/detail?id=696481
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();
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();
}
}
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
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);