我正在尝试使用Google Chrome自动下载XML文件。 我正在使用:
出现有害文件的消息时出现问题:
由于我使用的是Chromedriver,因此无法与此消息互动,因此我尝试接受chrome:// downloads页面上的下载。
打开chrome:// downloads页面后,我点击了“保存”按钮,但系统再次弹出警报以确认下载。
此弹出窗口不是Selenium弹出窗口,Chromedriver可以使用Dismiss()/ Accept()/ SendKeys()/ ...方法处理。当我尝试将SwitchTo()切换时,Chromedriver崩溃。
我试图直接发送{TAB}和{SPACE} / {RIGHT}和{ENTER}的击键,但是Chrome似乎无法捕获它们...
完整代码为:
String currentWindow = this.Drivers[Navegador].CurrentWindowHandle;
String popupHandle = "";
((IJavaScriptExecutor)this.Drivers[Navegador]).ExecuteScript("window.open('about:blank','_blank')");
ReadOnlyCollection<String> tabs = this.Drivers[Navegador].WindowHandles;
foreach (string handle in tabs){
if (handle != currentWindow){
popupHandle = handle;
break;
}
}
this.Drivers[Navegador].SwitchTo().Window(popupHandle);
this.Drivers[Navegador].Navigate().GoToUrl("chrome://downloads");
String script = "return document.querySelector('body > downloads-manager').shadowRoot.querySelector('#downloadsList > downloads-item').shadowRoot.querySelector('#dangerous > paper-button:nth-child(2)');";
//String script = "return document.querySelector('body > downloads-manager').shadowRoot.querySelector('#downloadsList > downloads-item:nth-child(2)').shadowRoot.querySelector('#url').textContent;";
IWebElement boton = (IWebElement) ((IJavaScriptExecutor) this.Drivers[Navegador]).ExecuteScript(script);
boton.Click();
Thread.Sleep(2000);
SendKeys.Send("{TAB}{SPACE}");
Thread.Sleep(1000);
this.Drivers[Navegador].Close();
this.Drivers[Navegador].SwitchTo().Window(currentWindow);
this.Drivers[Navegador].SwitchTo().DefaultContent();
result = true;
重要提示: 我尝试使用所有标志/选项/ experimental_options / user_preferences / ...来启动Chrome,但它无法正常工作。这些选项/参数在最新版本的Chrome或Chromedriver中似乎已弃用。
答案 0 :(得分:0)
正如与OP讨论的那样,以Java回答问题。
几个月前遇到了同样的问题,所以这对我有用,也可能对您有用。
Map<String, Object> chromePreferences = new Hashtable<String, Object>();
// Below preferences will disable popup dialog while downloading the file
chromePreferences.put("profile.default_content_settings.popups", 0);
chromePreferences.put("download.prompt_for_download", "false");
// Set the customised path for downloading the file, if required
chromePreferences.put("download.default_directory", "path");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("prefs", chromePreferences);
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
cap.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
//Now initiate ChromeDriver with the capabilities set above and continue with your automation
ChromeDriver chromeDriver = new ChromeDriver(cap);
答案 1 :(得分:0)
我最近遇到了这个问题,由于ChromeDriver中某些方法的弃用,上述解决方案无法正常工作。
经过大量研究,我决定改用IE,并从本文的启发中探索另一种选择-https://sqa.stackexchange.com/questions/3169/downloading-a-file-in-internet-explorer-through-selenium/3520我在JAVA中提出了此解决方案。
它不是“干净”的,但对我有用。
public static void main(String[] args) throws NoAlertPresentException,InterruptedException {
System.setProperty("webdriver.ie.driver","C:\\selenium-java-3.141.59\\IEDriverServer.exe");
String url ="myfileurl";
WebDriver driver = new InternetExplorerDriver();
driver.get(url);
try {
Robot robot = new Robot();
Thread.sleep(2000);
//press alt+s key to save
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_ALT);
Thread.sleep(2000);
}
catch (AWTException e) {
e.printStackTrace();
}
driver.close();
}