Сохранить файл с помощью Chromedriver в chrome: // загрузки

#selenium #selenium-webdriver #selenium-chromedriver

#selenium #selenium-webdriver #selenium-chromedriver

Вопрос:

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

  • Google Chrome версии 73.03683.75 (64 бита)
  • Chromedriver v73
  • Selenium WebDriver v3.14.0
  • C#

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

Сообщение о вредоносном файле

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

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

Всплывающее окно подтверждения загрузки в Chrome: // загрузки

Это всплывающее окно не является всплывающим Selenium, и Chromedriver может обрабатывать его с помощью Dismiss() / Accept () / SendKeys()/… методы. Когда я пытаюсь переключиться на него, Chromedriver вылетает.

Я пытался напрямую отправлять нажатия клавиш {TAB} и {ПРОБЕЛ} / {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 / experimental_options /user_preferences / … и это не сработало. Похоже, что эти параметры / аргументы устарели в последних версиях Chrome или Chromedriver.

Комментарии:

1. Хорошо, я задам глупый вопрос: почему вы хотите сохранить файл chromedriver в вашей папке Downloads?

2. Прошу прощения @C. Пек, но я не понимаю твоего вопроса. Файла chromedriver нет в папке downloads. По умолчанию я открываю экземпляр Chrome по умолчанию, который имеет папку downloads по умолчанию C:UsersMyUserDownloads

3. @Carlos у меня есть ответ на этот вопрос, но, извините, я специалист по Java, так поможет ли вам ответ на java?

4. Привет @SameerArora! Да, пожалуйста. Подскажите мне Java-решение, чтобы я мог его понять и создать что-нибудь на C #. Заранее спасибо.

5. @Carlos я добавил ответ, так что, по сути, вам просто нужно добавить некоторые возможности при запуске вашего chromedriver, чтобы решить вашу проблему. Дайте мне знать, если это решит вашу проблему.

Ответ №1:

Как обсуждалось с 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);
  

Ответ №2:

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

}