使用Chromedriver将文件保存在chrome:// downloads

时间:2019-03-17 12:01:06

标签: selenium selenium-webdriver selenium-chromedriver

我正在尝试使用Google Chrome自动下载XML文件。 我正在使用:

  • Google Chrome v73.0.3683.75(64位)
  • Chromedriver v73
  • Selenium WebDriver v3.14.0
  • C#

出现有害文件的消息时出现问题:

Harmful file message

由于我使用的是Chromedriver,因此无法与此消息互动,因此我尝试接受chrome:// downloads页面上的下载。

打开chrome:// downloads页面后,我点击了“保存”按钮,但系统再次弹出警报以确认下载。

Confirm download popup in 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中似乎已弃用。

2 个答案:

答案 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();

}