Як загрузіць любы файл і захаваць яго ў патрэбнае месца з дапамогай Selenium WebDriver

Я павінен выканаць наступную задачу з дапамогай Selenium WebDriver прыведзены ніжэй.

  1. Націсніце на любую спасылку/кнопку, якая пачаць загрузку любых файлаў (тыпу файла можа быць што-небудзь малюнак, PDF, банкі і г.д.)
  2. Націсніце на кнопку «Захаваць» на ўсплывальнае акно, калі з'явілася (напрыклад, у выпадку http://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar )
  3. Дайце патрэбнае месца, каб захаваць гэты файл.

Можа хто-небудзь долю, як мы можам рэалізаваць гэта з дапамогай Java?

27
Звязаныя пытанні тут: stackoverflow.com/questions/18439851/…</а>
дададзена аўтар stiemannkj1, крыніца
Вы можаце выкарыстоўваць AutoIT ў якасці альтэрнатывы, каб зрабіць гэта вельмі гладка, без змены або спасылкі на які-небудзь канфігурацыі ці ўласцівасцяў файла, вы можаце refere мой адказ на падобны пост
дададзена аўтар eaccmk, крыніца

7 адказы

Вы не зможаце атрымаць доступ да дыялогавага акна захавання. Вось кіруецца АС. Адзінае, што вы сапраўды збіраецеся быць у стане зрабіць, гэта ўсталяваць месцазнаходжанне загрузкі па змаўчанні для браўзэра і дазваляе яму аўтаматычна загружаць файлы. Затым праверце файл у Java.

Вы павінны праверыць гэты адказ ад гэтага папярэдні SO пытанне . У асноўным пры наладзе Firefox профіль дадаць выклік ўсталяваць ўласцівасць browser.helperApps.neverAsk.saveToDisk на падзелены коскамі спіс тыпаў MIME заўсёды спампаваць:

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

См гэтай Mozilla KB FAQ артыкула Аб Аб: конфігі.

UPDATE It looks like this may now be possible see this answer in another question

21
дададзена
што можна адкрыць дыялогавае акно, вы можаце выкарыстоўваць клас робата для таго, каб доступ і выконваць такія падзеі, як ENTER, Укладкі і ESCAPE з дапамогай класа робата захаваць
дададзена аўтар Luffy, крыніца
Сардэчна запрашаем. Дзякую Вас за абнаўленне адказу ....
дададзена аўтар Luffy, крыніца
Я не разумею, я выкарыстаў гэтыя дакладныя налады і PDF адкрыты нармальна, не захаваць на дыск. Ці ёсць альтэрнатыва акрамя выкарыстання запыту, пасля ўсёй гэтай працы было бы дрэнны абыходны шлях ... (інфармацыя аб PDF Старонка ўсталяваць яго ў якасці «дадатку/PDF», так, здаецца, нармальна)? дзякуй
дададзена аўтар Ando Jurai, крыніца
Што рабіць, калі я не ведаю, тып файла загрузкі яшчэ? гэта можа быць дынамічным?
дададзена аўтар weefwefwqg3, крыніца
@Luffy, дзякуй. Я бачу, ты адправіў адказ на іншае пытанне. Гэта было немагчыма, калі я ўпершыню адказаў на гэтае пытанне. Я абнавіў адказ спасылацца на ваша рашэнне.
дададзена аўтар Dirk, крыніца

Адмяніць/Захаваць дыялог ўсплывальнае акно можа з'яўляцца, таму што сайт пасылае вам іншы тып MIME.

Check the actual header content.

Выкарыстанне Firefox ўбудаваных інструментаў распрацоўніка, пстрыкніце правай кнопкай мышы, каб праверыць элемент/загрузкі звязаць праводку, то паглядзіце на сеткавай манітор, каб убачыць значэнне загалоўка ContentType вернутае .. Гэта будзе адзін вы хочаце выкарыстоўваць ..

enter image description here

Усталюйце параметры профілю адпаведна

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

I was expecting "text/csv" however got "application/octet-stream" once that was added to the accepted types list it all worked as expected, No popups

7
дададзена
Вау дзякуй за падкрэсліць той факт, што адзін павінен рэальна праверыць фактычнае HEADER ЎТРЫМАННЯ. Так як файл Я загружаю гэта CSV, я падумаў, што гэта павінна быць тэкст/CSV , але хлопчык быў я няправільна. У маім выпадку, гэта было нават не дадатку/актэт-струмень , як гэта было ў вашым выпадку, але прыкладання/CSV . Дзякуй!
дададзена аўтар mkab, крыніца

Адным з магчымых рашэнняў з'яўляецца атрыманне URL для файла праз Selenium, стварыць злучэнне (не-Селен), капіяваць печыва Selenium да злучэння (пры неабходнасці) і загрузіце файл. Большасць моў (API або бібліятэкі) для выканання HTTP-запытаў. Напрыклад, для дасягнення гэтай мэты ў Java, вы можаце выкарыстоўваць URL.openConnection() :

String link = linkElement.getAttribute("href");
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");

Вам можа спатрэбіцца скапіяваць печыва, якія Селен для імітацыі карыстальніка Селен (напрыклад, калі вы тэстуеце сайт, які патрабуе ўваходу ў сістэму).

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

Хоць гэты метад будзе адрознівацца для розных моў праграмавання, <�моцны> ён працуе аднолькава для ўсіх браўзэраў .

2
дададзена
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);
2
дададзена

Я думаю, што вы шукаеце что-то накшталт гэтага

//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();
1
дададзена
Я паспрабаваў гэта на Ubuntu, але як жа ўсё файлы захоўваюцца ў/TMP/mozilla_ [карыстальнік] 0/с файламі сканчаюцца .part
дададзена аўтар weefwefwqg3, крыніца

У выпадку, калі вы выкарыстоўваеце Java і Chromdriver, я распрацаваў бібліятэка , якія павінны зрабіць вашыя загрузкі значна прасцей.

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

@Test
void downloadAttachTest() throws InterruptedException {
    adamInternetPage.navigateToPage(driver);
    seleniumDownloadKPI.fileDownloadKPI(
            adamInternetPage.getFileDownloadLink(), "SpeedTest_16MB.dat");
    waitBeforeClosingBrowser();
}
0
дададзена

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

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

}
0
дададзена