#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: // загрузки, я нажимаю на кнопку Сохранить, но снова появляется предупреждение для подтверждения загрузки.
Это всплывающее окно не является всплывающим 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();
}