我有一个网页,当我单击按钮时,它会打开另一个选项卡,然后在其中几秒钟后下载 csv 文件。我试图无头自动化,但我无法做到这一点。我正在使用下面的代码。但我认为以下解决方案适用于在同一窗口中进行下载。我如何调整它以适合我的情况?
代码工作正常,如果我通过注释掉 options.addArguments("--headless") 行正常运行(非无头),文件就会下载。
System.setProperty("webdriver.chrome.driver", webdriverpath);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("useAutomationExtension", false);
options.addArguments("--test-type");
options.addArguments("--headless");
options.addArguments("--disable-extensions");
ChromeDriverService driverService = ChromeDriverService.createDefaultService();
HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("download.default_directory", downloadFilepath);
options.setExperimentalOption("prefs", chromePrefs);
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);
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);
//OPEN URL
//Click Button
在无头模式下下载时我遇到同样的问题。(但在非无头模式下工作)
我找到了解决方案(示例中Python):
第一步 - 单击“下载”按钮并切换到新选项卡:
download_btn.send_keys(Keys.Control + Keys.RETURN) //click button to download
print("windows count:", len(self.driver.window_handles)) //check how many windonws(tab)
print("window:", self.driver.current_window_handle) //check current window
download_btn.send_keys(Keys.Control + "2") //switch window to new tab
self.driver.switch_to.window(self.driver.window_handles[-1]) // using driver switch to last created tab
print("windows count:", len(self.driver.window_handles))
print("window:", self.driver.current_window_handle)
输出(确认窗口已成功切换到新选项卡):
窗户数量:2
窗口:CDwindow-9D0B0A86678939EE6EA89B4627016F5A
窗户数量:2
窗口:CDwindow-43ACC6E22256C42592CD34E880A08079
第二步 - 再次配置下载行为
您可以将下面的代码包装起来并在切换到新选项卡后调用它。
params = {'behavior': 'allow', 'downloadPath': download_path}
print("Change default download dir to :", params['downloadPath'])
driver.execute_cdp_cmd('Page.setDownloadBehavior', params)
第三步 - 重新加载页面(重要步骤)
它将触发下载行为。
self.driver.refresh()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)