Сохраните файл с Chromedriver в chrome: // downloads - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь автоматизировать загрузку XML-файла с помощью Google Chrome. Я использую:

  • Google Chrome v73.0.3683.75 (64 бита)
  • Chromedriver v73
  • Selenium WebDriver v3.14.0
  • C #

Проблема возникает, когда появляется сообщение о вредоносном файле:

Harmful file message

Поскольку я использую Chromedriver, я не могу взаимодействовать с этим сообщением, поэтому я попытался принять загрузку со страницы chrome: // downloads.

Как только я открываю страницу загрузки chrome: //, я нажимаю кнопку Сохранить, но снова появляется предупреждение для подтверждения загрузки.

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;

ВАЖНОЕ ПРИМЕЧАНИЕ: Я попытался запустить Chrome со всеми возможными флагами / options / экспериментальные_опции / user_preferences / ... и это не работает. Эти параметры / аргументы устарели в последних версиях Chrome или Chromedriver.

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Недавно я столкнулся с этой проблемой, и из-за устаревания некоторых методов в 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();

}   
0 голосов
/ 17 марта 2019

Как обсуждалось с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...