Как изменить местоположение загрузки файла в Webdriver при использовании драйвера chrome driver/firefox
Я пытаюсь сохранить изображение, используя опцию save в отдельной папке. Я нашел способ, с помощью которого я могу щелкнуть правой кнопкой мыши по изображению, которое я хочу сохранить, используя параметр "Сохранить как". Но проблема, в которой я застрял, - это получить окно os, которое спрашивает, где сохранить файл, я не могу отправить нужное место, потому что я не знаю, как это сделать. Я рассмотрел подобные вопросы, заданные на этом форуме, но не помог до сих пор.
Код -
Для Firefox -
public class practice {
public void pic() throws AWTException{
WebDriver driver;
//Proxy Setting
FirefoxProfile profile = new FirefoxProfile();
profile.setAssumeUntrustedCertificateIssuer(false);
profile.setEnableNativeEvents(false);
profile.setPreference("network.proxy.type", 1);
profile.setPreference("network.proxy.http", "localHost");
profile.setPreference("newtwork.proxy.http_port",3128);
//Download setting
profile.setPreference("browser.download.folderlist", 2);
profile.setPreference("browser.helperapps.neverAsk.saveToDisk","jpeg");
profile.setPreference("browser.download.dir", "C:\\Users\\Admin\\Desktop\\ScreenShot\\pic.jpeg");
driver = new FirefoxDriver(profile);
driver.navigate().to("http://stackoverflow.com/users/2675355/shantanu");
driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"));
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"))).perform();
action.contextClick().perform();
Robot robo = new Robot();
robo.keyPress(KeyEvent.VK_V);
robo.keyRelease(KeyEvent.VK_V);
// Here i am getting the os window but don't know how to send the desired location
}//method
}//class
Для хром-
public class practice {
public void s() throws AWTException{
WebDriver driver;
System.setProperty("webdriver.chrome.driver","C:\\Users\\Admin\\Desktop\\chromedriver.exe");
driver = new ChromeDriver();
driver.navigate().to("http://stackoverflow.com/users/2675355/shantanu");
driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"));
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("//*[@id='large-user-info']/div[1]/div[1]/a/div/img"))).perform();
action.contextClick().perform();
Robot robo = new Robot();
robo.keyPress(KeyEvent.VK_V);
robo.keyRelease(KeyEvent.VK_V);
// Here i am getting the os window but don't know how to send the desired location
}
}
![This is the pop up window where i am stuck]()
Ответы
Ответ 1
В коде есть две вещи.
Для Firefox:
Вам нужно установить
profile.setPreference("browser.download.dir", "C:\\Users\\Admin\\Desktop\\ScreenShot\\");
не
profile.setPreference("browser.download.dir", "C:\\Users\\Admin\\Desktop\\ScreenShot\\pic.jpeg");
Во-вторых, вы устанавливаете параметр browser.download.folderlist, он browser.download.folderList (L caps в списке каталогов).
Как только вы достигнете этого, вы можете использовать свой класс Robot для выполнения желаемых операций.
Для Chromedriver выполните следующие действия:
String downloadFilepath = "/path/to/download";
HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("download.default_directory", downloadFilepath);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", chromePrefs);
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
cap.setCapability(ChromeOptions.CAPABILITY, options);
WebDriver driver = new ChromeDriver(cap);
Надеюсь, это поможет.:)
Ответ 2
Я потратил много времени, чтобы исследовать, как загрузить pdf файл в браузере Firefox, без появления всплывающего окна Save As. Это может помочь кому-то.
После некоторого локального расследования, как загрузить файл pdf в firefox без всплывающего окна Save As, я нашел минимальное требуемое предпочтение в профиле Firefox:
profile.setPreference("pdfjs.disabled", true);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
Конечно, вы можете добавить дополнительные настройки.
Он работает в версиях Firefox 45-46.
Ответ 3
Для браузера Chrome:
Даже вы можете отключить диалог Windows (Save As Dialogue) со следующим фрагментом кода. Вам нужно сделать следующие настройки в настройках хромированных рекордов:
- отключите приглашение загрузки, если оно отображается
- установить каталог по умолчанию для загрузки файла
- Если включен плагин просмотра PDF, который открывает файл PDF в браузере, вы можете отключить его, чтобы загрузка могла автоматически запускаться.
-
Принять любой сертификат в браузере
String downloadFilepath = "/path/to/download/directory/";
Map<String, Object> preferences = new Hashtable<String, Object>();
preferences.put("profile.default_content_settings.popups", 0);
preferences.put("download.prompt_for_download", "false");
preferences.put("download.default_directory", downloadFilepath);
// disable flash and the PDF viewer
preferences.put("plugins.plugins_disabled", new String[]{
"Adobe Flash Player", "Chrome PDF Viewer"});
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", preferences);
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
driver = new ChromeDriver(capabilities);
Ответ 4
Наверное, это не лучшее решение, но вы можете попробовать использовать sikuli api для подтверждения сохранения для окна, который появляется.
В поле "Сохранить как окно" находится окно ОС.
Ответ 5
Вы частично ответили на свой вопрос:
проблема, в которой я застреваю, - это получить окно os
Selenium - это инструмент браузера - os window не является браузером! Вам нужно будет использовать что-то еще. В зависимости от ваших потребностей есть много вариантов: Sikuli, Robot, AutoIt,...
Ответ 6
Используйте тот же класс робота и нажмите "Enter", чтобы выбрать "Сохранить" в диалоговом окне Windows.
robo.keyPress(KeyEvent.VK_ENTER);
robo.keyRelease(KeyEvent.VK_ENTER);
если вам нужно переименовать его, скопируйте имя файла в буфер обмена и пройдите, как показано ниже
StringSelection file = new StringSelection("D:\\image.jpg");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(file, null);
Robot rb = new Robot();
rb.setAutoDelay(2000); // Similar to thread.sleep
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);
rb.keyRelease(KeyEvent.VK_V);
rb.setAutoDelay(2000);
rb.keyPress(KeyEvent.VK_ENTER);
rb.keyRelease(KeyEvent.VK_ENTER);