Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium 无法在无头模式下通过Google Chrome下载.csv文件_Selenium_Selenium Webdriver_Google Chrome Headless - Fatal编程技术网

Selenium 无法在无头模式下通过Google Chrome下载.csv文件

Selenium 无法在无头模式下通过Google Chrome下载.csv文件,selenium,selenium-webdriver,google-chrome-headless,Selenium,Selenium Webdriver,Google Chrome Headless,我一直尝试在Chrome headless模式下使用selenium下载csv文件,但在我的场景中,不起作用。我试着在没有头的情况下运行同一个脚本,结果成功了。我尝试了相同的无头配置的网站,它的工作。下面是我正在使用的chrome无头配置 System.setProperty("webdriver.chrome.driver", Constants.CHROME_DRIVER); ChromeOptions options = new ChromeOptions(); options.addAr

我一直尝试在Chrome headless模式下使用selenium下载csv文件,但在我的场景中,不起作用。我试着在没有头的情况下运行同一个脚本,结果成功了。我尝试了相同的无头配置的网站,它的工作。下面是我正在使用的chrome无头配置

System.setProperty("webdriver.chrome.driver", Constants.CHROME_DRIVER);
ChromeOptions options = new ChromeOptions();
options.addArguments("--test-type");
options.addArguments("--headless");
options.addArguments("--disable-extensions"); //to disable browser extension popup
options.addArguments("window-size=1980,1080");
options.addArguments("--disable-web-security");
options.addArguments("--no-sandbox");
options.addArguments("--disable-gpu");
options.addArguments("--disable-popup-blocking");
options.addArguments("--start-maximized");
options.addArguments("--allow-running-insecure-content");
options.setExperimentalOption("w3c", false);
options.addArguments("--ignore-certificate-errors");
options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36");

DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, options);

// set performance logger
// this sends Network.enable to chromedriver
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability("goog:loggingPrefs", logPrefs);

ChromeDriverService driverService = ChromeDriverService.createDefaultService();
driver = new ChromeDriver(driverService, cap);
String downloadFilepath = "C:\\Users\\User\\Downloads";
System.out.println(downloadFilepath);
Map < String, Object > commandParams = new HashMap<String, Object>();
commandParams.put("cmd", "Page.setDownloadBehavior");
Map < String, Object > params = new HashMap<String, Object>();
params.put("behavior", "allow");
params.put("download.prompt_for_download", false);
params.put("downloadPath", downloadFilepath);
commandParams.put("params", params);
ObjectMapper objectMapper = new ObjectMapper();
HttpClient httpClient = HttpClientBuilder.create().build();
try {
    String command = objectMapper.writeValueAsString(commandParams);
    String u = driverService.getUrl().toString() + "/session/" + ((ChromeDriver)driver).getSessionId() + "/chromium/send_command";
    System.out.println("U: " + u.toString());
    HttpPost request = new HttpPost(u);
    request.addHeader("content-type", "application/json");
    request.setEntity(new StringEntity(command));
    httpClient.execute(request);
} catch (Exception e) { }

driver.get(prop.getProperty("url"));
下载该文件

请在下面的日志中找到,您可以看到突出显示的部分,其中指出
net::ERR_已中止
,但我在无头和无头两种情况下都遇到了此错误

无头模式的性能日志

任何人都知道我做错了什么


编辑:当用户单击导出按钮时,应用程序流将打开一个新窗口,用户在其中填充数据并单击一个按钮,该按钮调用函数进行某种验证。验证后,它使用
document.formName.submit()

提交表单。我能够找到解决方案。下面是工作代码

System.setProperty("webdriver.chrome.driver", Constants.CHROME_DRIVER);
ChromeOptions options = new ChromeOptions();
options.addArguments("--test-type");
options.addArguments("--headless");
options.addArguments("--disable-extensions"); //to disable browser extension popup
options.addArguments("window-size=1980,1080");
options.addArguments("--disable-web-security");
options.addArguments("--no-sandbox");
options.addArguments("--disable-gpu");
options.addArguments("--disable-popup-blocking");
options.addArguments("--start-maximized");
options.addArguments("--allow-running-insecure-content");
options.setExperimentalOption("w3c", false);
options.addArguments("--ignore-certificate-errors");
options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36");

HashMap<String, Object> chromePreferences = new HashMap<String, Object>();

// This part was missing in my old code.
chromePreferences.put("download.prompt_for_download", false);
chromePreferences.put("download.directory_upgrade", true);
chromePreferences.put("safebrowsing.enabled", false);
chromePreferences.put("profile.default_content_settings.popups", 0);
chromePreferences.put("safebrowsing.disable_download_protection", true);
chromePreferences.put("download.default_directory", downloadFilepath);
options.setExperimentalOption("prefs", chromePreferences);

DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, options);

// set performance logger
// this sends Network.enable to chromedriver
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability("goog:loggingPrefs", logPrefs);

ChromeDriverService driverService = ChromeDriverService.createDefaultService();
driver = new ChromeDriver(driverService, cap);
String downloadFilepath = "C:\\Users\\User\\Downloads";
System.out.println(downloadFilepath);
Map < String, Object > commandParams = new HashMap<String, Object>();
commandParams.put("cmd", "Page.setDownloadBehavior");
Map < String, Object > params = new HashMap<String, Object>();
params.put("behavior", "allow");
params.put("downloadPath", downloadFilepath);
commandParams.put("params", params);
ObjectMapper objectMapper = new ObjectMapper();
HttpClient httpClient = HttpClientBuilder.create().build();
try {
    String command = objectMapper.writeValueAsString(commandParams);
    String u = driverService.getUrl().toString() + "/session/" + ((ChromeDriver)driver).getSessionId() + "/chromium/send_command";
    System.out.println("U: " + u.toString());
    HttpPost request = new HttpPost(u);
    request.addHeader("content-type", "application/json");
    request.setEntity(new StringEntity(command));
    httpClient.execute(request);
} catch (Exception e) { }

System.setProperty(“webdriver.chrome.driver”,Constants.chrome\u driver);
ChromeOptions选项=新的ChromeOptions();
options.addArguments(“--test type”);
选项。添加参数(“--headless”);
options.addArguments(“--disable extensions”)//禁用浏览器扩展弹出窗口
options.addArguments(“窗口大小=19801080”);
options.addArguments(“--disable web security”);
options.addArguments(“--no sandbox”);
options.addArguments(“--disable gpu”);
options.addArguments(“--disable popup blocking”);
options.addArguments(“--start maximized”);
options.addArguments(“--允许运行不安全的内容”);
options.setExperimentalOption(“w3c”,false);
options.addArguments(“--ignore certificate errors”);
options.addArguments(“用户代理=Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/79.0.3945.130 Safari/537.36”);
HashMap chromePreferences=新HashMap();
//我的旧代码中缺少这一部分。
chromePreferences.put(“下载.提示下载”,false);
chromePreferences.put(“download.directory\u upgrade”,true);
chromePreferences.put(“safebrowsing.enabled”,false);
chromePreferences.put(“profile.default\u content\u settings.popups”,0);
chromePreferences.put(“安全浏览.禁用下载保护”,true);
chromePreferences.put(“download.default_目录”,downloadFilepath);
选项。设置实验选项(“优先”,色度优先);
DesiredCapabilities=DesiredCapabilities.chrome();
上限设置能力(色度选项、能力、选项);
//设置性能记录器
//这会将Network.enable发送到chromedriver
LoggingPreferences logPrefs=新的LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE,Level.ALL);
上限设置能力(“goog:loggingPrefs”,logPrefs);
ChromeDriverService driverService=ChromeDriverService.createDefaultService();
驾驶员=新的镀铬驾驶员(驾驶员服务,cap);
String downloadFilepath=“C:\\Users\\User\\Downloads”;
System.out.println(下载文件路径);
MapcommandParams=newhashmap();
commandParams.put(“cmd”,“Page.setDownloadBehavior”);
Mapparams=newhashmap();
参数put(“行为”、“允许”);
参数put(“downloadPath”,downloadFilepath);
commandParams.put(“params”,params);
ObjectMapper ObjectMapper=新的ObjectMapper();
HttpClient HttpClient=HttpClientBuilder.create().build();
试一试{
String命令=objectMapper.writeValueAsString(commandParams);
字符串u=driverService.getUrl().toString()+“/session/”+((ChromeDriver)驱动程序).getSessionId()+“/Chrome/send_命令”;
System.out.println(“U:+U.toString());
HttpPost请求=新的HttpPost(u);
addHeader(“内容类型”、“应用程序/json”);
request.setEntity(新的StringEntity(命令));
httpClient.execute(请求);
}捕获(例外e){}

这篇文章帮助我解决了这个问题

Headless不支持这个。也不支持访问剪贴板。@Jortega headless chrome支持文件下载,因为我已经在其他一些网站上测试过了。问题出在这个特定的网页上。除了selenium之外呢。当您尝试手动下载时,它是否工作?是的,它适用于手动下载和使用chrome drive(无头)尝试只单击下载按钮下载数据?
System.setProperty("webdriver.chrome.driver", Constants.CHROME_DRIVER);
ChromeOptions options = new ChromeOptions();
options.addArguments("--test-type");
options.addArguments("--headless");
options.addArguments("--disable-extensions"); //to disable browser extension popup
options.addArguments("window-size=1980,1080");
options.addArguments("--disable-web-security");
options.addArguments("--no-sandbox");
options.addArguments("--disable-gpu");
options.addArguments("--disable-popup-blocking");
options.addArguments("--start-maximized");
options.addArguments("--allow-running-insecure-content");
options.setExperimentalOption("w3c", false);
options.addArguments("--ignore-certificate-errors");
options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36");

HashMap<String, Object> chromePreferences = new HashMap<String, Object>();

// This part was missing in my old code.
chromePreferences.put("download.prompt_for_download", false);
chromePreferences.put("download.directory_upgrade", true);
chromePreferences.put("safebrowsing.enabled", false);
chromePreferences.put("profile.default_content_settings.popups", 0);
chromePreferences.put("safebrowsing.disable_download_protection", true);
chromePreferences.put("download.default_directory", downloadFilepath);
options.setExperimentalOption("prefs", chromePreferences);

DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, options);

// set performance logger
// this sends Network.enable to chromedriver
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability("goog:loggingPrefs", logPrefs);

ChromeDriverService driverService = ChromeDriverService.createDefaultService();
driver = new ChromeDriver(driverService, cap);
String downloadFilepath = "C:\\Users\\User\\Downloads";
System.out.println(downloadFilepath);
Map < String, Object > commandParams = new HashMap<String, Object>();
commandParams.put("cmd", "Page.setDownloadBehavior");
Map < String, Object > params = new HashMap<String, Object>();
params.put("behavior", "allow");
params.put("downloadPath", downloadFilepath);
commandParams.put("params", params);
ObjectMapper objectMapper = new ObjectMapper();
HttpClient httpClient = HttpClientBuilder.create().build();
try {
    String command = objectMapper.writeValueAsString(commandParams);
    String u = driverService.getUrl().toString() + "/session/" + ((ChromeDriver)driver).getSessionId() + "/chromium/send_command";
    System.out.println("U: " + u.toString());
    HttpPost request = new HttpPost(u);
    request.addHeader("content-type", "application/json");
    request.setEntity(new StringEntity(command));
    httpClient.execute(request);
} catch (Exception e) { }