Как скачать любой файл и сохранить его в нужном месте с помощью Selenium Webdriver
Я должен выполнить следующую задачу, используя Selenium Webdriver, приведенный ниже.
- Нажмите на любую ссылку / кнопку, которая начинает загрузку любого файла (тип файла может быть любым изображением, pdf, jar и т. Д.)
- Нажмите "Сохранить" во всплывающем окне, если оно появилось (например, в случае http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar)
- Укажите желаемое место для сохранения этого файла.
Кто-нибудь может поделиться, как мы можем реализовать это с помощью Java?
7 ответов
Вы не сможете получить доступ к диалоговому окну сохранения. Это контролируется ОС. Единственное, что вы действительно сможете сделать, это установить местоположение загрузки по умолчанию для браузера и позволить ему автоматически загружать файлы. Затем проверьте файл в Java.
Вы должны проверить этот ответ из этого предыдущего вопроса SO. В основном при настройке вашего профиля Firefox вы добавляете вызов, чтобы установить свойство browser.helperApps.neverAsk.saveToDisk
в разделенный запятыми список типов MIME, чтобы всегда загружать:
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");
См. Эту статью часто задаваемых вопросов о Mozilla KB на странице About: config.
ОБНОВЛЕНИЕ Похоже, что теперь это возможно, можно увидеть ответ на другой вопрос
Может появиться всплывающее окно "Отмена / Сохранить", так как сайт отправляет вам другой тип MIME.
Проверьте фактическое содержание заголовка.
Используя встроенные в Fire fox инструменты разработчика, щелкните правой кнопкой мыши, чтобы просмотреть ссылку на элемент / загрузку, опубликованную в вашем сообщении, а затем посмотрите на монитор сети, чтобы увидеть возвращаемое значение заголовка ContentType. Это будет тот, который вы хотите использовать.
Настройте параметры своего профиля соответственно
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
"application/octet-stream,text/csv");
Я ожидал "text/csv", однако получил "application/octet-stream", как только он был добавлен в список принятых типов, все заработало, как и ожидалось, никаких всплывающих окон
Одним из возможных решений является получение URL-адреса для файла через Selenium, создание (не Selenium) соединения, копирование файлов cookie Selenium в соединение (при необходимости) и загрузка файла. Большинство языков имеют API (или библиотеки) для выполнения HTTP-запросов. Например, чтобы сделать это в Java, вы можете использовать URL.openConnection()
:
String link = linkElement.getAttribute("href");
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
Вам может понадобиться скопировать файлы cookie, которые есть у Selenium, чтобы имитировать пользователя Selenium (например, если вы тестируете веб-сайт, требующий входа в систему).
Set<Cookie> cookies = webDriver.manager().getCookies();
String cookieString = "";
for (Cookie cookie : cookies) {
cookieString += cookie.getName() + "=" + cookie.getValue() + ";";
}
httpURLConnection.addRequestProperty("Cookie", cookieString);
Тогда вы можете использовать HttpURLConnection.getInputStream()
записать содержимое файла в нужное вам место.
try (InputStream in = httpURLConnection.getInputStream()) {
Files.copy(in, new File("/path/to/file.ext").toPath(),
StandardCopyOption.REPLACE_EXISTING);
}
Хотя этот метод будет отличаться для разных языков программирования, он работает одинаково для всех браузеров.
Я думаю, что вы ищете что-то вроде этого
//common to all the cases
FirefoxProfile prof = new FirefoxProfile();
//Case:1 - Use this case to set download this code to your browser's default location
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");
//Case:2 - Download file to Desktop
//prof.setPreference("browser.download.folderList", 0);
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");
//Case:3 - Download to custom folder path. Replace d:\\selenium with your Download Location
prof.setPreference("browser.download.dir","D:\\selenium\\");
prof.setPreference("browser.download.folderList", 2);
prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");
//This will work for all cases mentioned above
WebDriver driver = new FirefoxDriver(prof);
driver.get("http://docs.seleniumhq.org/download/");
driver.findElement(By.xpath("//tr[1]/td[4]/a[text()='Download']")).click();
Если вы используете Java и Chromdriver, я разработал библиотеку, которая должна значительно упростить загрузку.
Среди его возможностей вы можете установить каталог загрузки в одну строку кода и убедиться, что ваш файл был успешно загружен:
@Test
void downloadAttachTest() throws InterruptedException {
adamInternetPage.navigateToPage(driver);
seleniumDownloadKPI.fileDownloadKPI(
adamInternetPage.getFileDownloadLink(), "SpeedTest_16MB.dat");
waitBeforeClosingBrowser();
}
Вы можете использовать приведенный ниже код, чтобы сохранить файл в нужном месте.
package popups;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class FileDownloadPopup
{
WebDriver driver;
FirefoxProfile prof = new FirefoxProfile();
FirefoxOptions options = new FirefoxOptions();
@BeforeMethod
public void setEnvi()
{
System.setProperty("webdriver.gecko.driver", "E:\\Selenium Dependencies\\BrowserExecutables\\geckodriver_win64_v0.21.0.exe");
prof.setPreference("browser.download.dir","E:\\Downloads");
prof.setPreference("browser.download.folderList", 2);
prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
options.setProfile(prof);
driver = new FirefoxDriver(options);
driver.get("http://file-examples.com/index.php/sample-documents-download/sample-xls-download/");
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
@Test
public void FDPP()
{
driver.findElement(By.xpath("(//a[text()='Download sample xlsx file'])[1]")).click();
}
@AfterMethod
public void closeEnvi()
{
driver.close();
}
}
String path="D:\xyz\abc\";
FirefoxOptions profile = new FirefoxOptions();
profile.addPreference("browser.download.folderList", 2);
profile.addPreference("browser.download.manager.showWhenStarting", false);
profile.addPreference("browser.download.dir", **path**);
profile.addPreference("browser.helperApps.neverAsk.openFile","text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
profile.addPreference("browser.helperApps.neverAsk.saveToDisk","text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
profile.addPreference("browser.helperApps.alwaysAsk.force", false);
profile.addPreference("browser.download.manager.alertOnEXEOpen", false);
profile.addPreference("browser.download.manager.focusWhenStarting", false);
profile.addPreference("browser.download.manager.useWindow", false);
profile.addPreference("browser.download.manager.showAlertOnComplete", false);
profile.addPreference("browser.download.manager.closeWhenDone", false);
new FirefoxDriver(profile);