我无法让Selenium和Chrome(Canary)下载文件。 我正在使用Java和Chrome 59/60(因为我的测试适用于Windows和Linux),我正在尝试从网页开始下载文件。
当我从selenium不设置无头模式时,会打开chrome窗口并下载文件。
当我设置--headless
标志时,Chrome窗口无法打开,下载也无法启动。
public static void chromeDownload() throws IOException, InterruptedException{
ChromeOptions options = new ChromeOptions();
String downloadFilepath = "";
if (ValidateOS.isWindows()){
System.out.println("This is a Windows system.");
System.setProperty("webdriver.chrome.driver", "resources\\driver\\chromedriver.exe");
options.setBinary("C:\\Users\\Juri\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe");
downloadFilepath = "C:\\";
} else if (ValidateOS.isUnix()){
System.out.println("This is a Unix system.");
System.setProperty("webdriver.chrome.driver", "resources/driver/chromedriver");
options.setBinary("/usr/bin/google-chrome");
downloadFilepath = "/home/juri/";
}
// Manage the download
HashMap<String, Object> chromePrefs = new HashMap<>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("download.default_directory", downloadFilepath);
// Save Chrome Options
HashMap<String, Object> chromeOptionsMap = new HashMap<>();
options.setExperimentalOption("prefs", chromePrefs);
options.addArguments("--headless --disable-gpu");
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, chromeOptionsMap);
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
cap.setCapability(ChromeOptions.CAPABILITY, options);
ChromeDriver driver = new ChromeDriver(cap);
driver.get("http://localhost/my-test-page.html");
driver.findElement(By.id("download")).click();
Thread.sleep(5000); // wait 5 seconds for a small file to download.. yes.. I know...
driver.quit();
}
点击,在GUI模式下开始下载。在无头模式下,它没有。
如何解决?
我正在使用Chrome Canary,它的v.60附带了 - 无头功能。在没有gui的服务器上运行抓取器非常方便。 但是,出于同样的原因......我发现在没有GUI的服务器上下载Chrome是没用的。 除了主要问题..我想知道你是否,开发人员认为在Linux服务器上安装chrome只是为了在无头模式下启动它是可以的。
更新: 我仍然在寻找一个解决方案,如果有人会读到这个:/搜索结果有几个,我尝试了所有
答案 0 :(得分:0)
通过调整此链接中的代码解决: Download files in Java, Selenium using ChromeDriver and headless mode
对于那些想知道我的代码现在如何......
的人public static void chromeDownload(String address, String Headless, String DownDir) throws IOException, InterruptedException{
ChromeOptions options = new ChromeOptions();
String downloadFilepath = DownDir;
if (ValidateOS.isWindows()){
System.out.println("This is a Windows system.");
System.setProperty("webdriver.chrome.driver", "resources\\driver\\chromedriver.exe");
//options.setBinary("C:\\Users\\Juri\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe");
// If this is commented, the grabber will use the main Chrome
} else if (ValidateOS.isUnix()){
System.out.println("This is a Unix system.");
System.setProperty("webdriver.chrome.driver", "resources/driver/chromedriver");
options.setBinary("/usr/bin/google-chrome");
}
switch (Headless.toUpperCase()){
case "TRUE":
options.addArguments("--headless --disable-gpu");
break;
case "FALSE":
default:
options.addArguments("--window-size=1152,768");
break;
}
options.addArguments("--test-type");
options.addArguments("--disable-extension");
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", downloadFilepath);
params.put("cmd", "Page.setDownloadBehavior");
commandParams.put("params", params);
ObjectMapper objectMapper = new ObjectMapper();
CloseableHttpClient 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(address);
driver.findElement(By.id("download")).click();
driver.quit();
}
答案 1 :(得分:0)
您期望使用“ Docker”吗?使用selenium Grid和任意数量的浏览器启动dockerized Ubuntu。或者只是没有Selenium网格的浏览器。
另一方面,您可以使用无头模式,也可以使用多线程。 例如:
下载file。
然后仅使用以下命令启动:docker-compose up -d
每个服务器进行一些调整,以访问“ localhost”上的网格服务器
http://localhost:4444/grid/console
http://localhost:4444/wd/hub
使用以下代码:
WebDriver驱动程序=新的RemoteWebDriver(新的URL(“ http://localhost:4444/wd/hub”))); //处理URL()的异常 构造函数。
您拥有带有浏览器的轻量级虚拟机,服务器可以处理任何数量的服务器。而且不需要--headless
模式
但这不是最初问题的解决方案。