Подтвердить что ты не робот

Как загрузить любой файл и сохранить его в нужное место с помощью Selenium Webdriver

Мне нужно выполнить следующую задачу, используя Selenium Webdriver, приведенную ниже.

  • Нажмите любую ссылку/кнопку, которая начнет загружать любой файл (тип файла может быть любым изображением, pdf, jar и т.д.).
  • Нажмите "Сохранить" на всплывающем окне, если оно появилось (например, в случае http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar)
  • Дайте нужное место для сохранения этого файла.

Может ли кто-нибудь поделиться, как мы можем реализовать это с помощью Java?

4b9b3361

Ответ 1

Вы не сможете получить доступ к диалоговому окну сохранения. Это контролируется ОС. Единственное, что вы действительно сможете сделать, это установить местоположение загрузки по умолчанию для браузера и позволить ему автоматически загружать файлы. Затем проверьте файл на Java.

Вы должны проверить этот ответ на этот предыдущий вопрос SO. В основном при настройке вашего профиля Firefox вы добавляете вызов, чтобы установить свойство browser.helperApps.neverAsk.saveToDisk в список разделенных запятыми типов MIME, которые всегда загружаются:

firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

См. Статью Mozilla KB FAQ о About: configs.

ОБНОВЛЕНИЕ Похоже, что теперь можно увидеть этот ответ в другом вопросе

Ответ 2

Всплывающее окно Отмена/Сохранение может появляться, поскольку сайт отправляет вам другой тип MIME.

Проверить содержимое заголовка.

Используя созданный Firefox встроенный инструмент разработчика, щелкните правой кнопкой мыши, чтобы проверить ссылку на элемент/загрузку вашей публикации, а затем взгляните на монитор сети, чтобы увидеть возвращаемое значение заголовка ContentType. Это будет тот, который вы хотите использовать.

введите описание изображения здесь

Установите соответствующие настройки профиля

 firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
                     "application/octet-stream,text/csv");

Я ожидал, что "text/csv" получил "application/octet-stream", как только это было добавлено в список принятых типов, все работало, как ожидалось, Без всплывающих окон

Ответ 3

Одним из возможных решений является получение URL-адреса файла через Selenium, создание (не-селенового) соединения, копирование файлов Selenium cookie на соединение (при необходимости) и загрузка файла. Большинство языков имеют 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);
}

Хотя этот метод будет отличаться для разных языков программирования, он работает одинаково для всех браузеров.

Ответ 4

Я думаю, что вы ищете что-то вроде этого

//common to all the cases
FirefoxProfile prof = new FirefoxProfile();

//Case:1 - Use this case to set download this code to your browser 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();

Ответ 5

Если вы используете Java и Chromdriver, я разработал библиотеку, которая упростит загрузку.

Среди его функций вы можете установить каталог загрузки в одной строке кода и убедиться, что ваш файл был загружен успешно:

@Test
void downloadAttachTest() throws InterruptedException {
    adamInternetPage.navigateToPage(driver);
    seleniumDownloadKPI.fileDownloadKPI(
            adamInternetPage.getFileDownloadLink(), "SpeedTest_16MB.dat");
    waitBeforeClosingBrowser();
}

Ответ 6

Вы можете использовать приведенный ниже код, чтобы сохранить файл в нужном месте.

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();
    }

}

Ответ 7

Sikulixapi позволит вам получить доступ к диалоговому окну и ввести поле, в котором вы хотите сохранить его, а также нажать кнопку "Сохранить". http://sikulix.com/

Ответ 8

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);