Truy cập vào hộp thoại tải xuống tệp trong Firefox


83

Có loại API nào có thể cho phép tôi thao tác hộp thoại tải xuống tệp trong Firefox không? (Tôi muốn truy cập một cái xuất hiện khi người dùng làm điều gì đó, không phải tự mình khởi tạo cái gì đó).

Những gì tôi muốn làm là truy cập hộp thoại này từ Selenium (và liệu "chế độ đặc quyền" của Selenium có đủ để truy cập giao diện chrome hay không là điều tôi cũng không chắc chắn).


3
Tôi vừa dành phần tốt nhất trong ba tuần để định cấu hình máy chủ riêng ảo Apache của riêng mình lần đầu tiên (vì nó hơi phức tạp khi chạy Selenium trên lưu trữ được chia sẻ), để Firefox, Selenium và Python làm việc cùng nhau, viết mã Python thực tế. thông qua một trang web rất nhiều JavaScript, tất cả để tải xuống một tệp ở cuối trang đó. Sau đó, tôi nhận ra rằng tôi không biết làm thế nào để thực sự truy cập vào tệp đã tải xuống. Tôi thực sự vui vì bạn đã đặt câu hỏi trước.
Paul D. Waite

AppleScript sẽ rất tốt cho điều đó, nếu Firefox có một từ điển AppleScript phù hợp.
Nicolas Barbulesco

Cần bất cứ ai giúp đỡ tôi [Câu hỏi trong trang web này] [1] [1]: stackoverflow.com/questions/27058053/...
Yevgeniy Semashko

Câu trả lời:


33

Không phải là tôi biết. Nhưng bạn có thể định cấu hình Firefox để tự động bắt đầu tải xuống và lưu tệp vào một nơi cụ thể. Sau đó, thử nghiệm của bạn có thể kiểm tra xem tệp đã thực sự đến chưa.


Được, tôi nghĩ tôi sẽ đi theo giải pháp này.
Andrey Shchekin

1
Nhưng selenium sẽ khởi chạy Firefox trong cấu hình mặc định (Vì không có cấu hình nào được chỉ định) nên mỗi khi bạn cấu hình nó. Thay vào đó, hãy tạo một hồ sơ mới theo sở thích của bạn để dễ dàng hơn.
Vignesh Dhamodaran

71

Tôi có một giải pháp cho vấn đề này, hãy kiểm tra mã:

FirefoxProfile firefoxProfile = new FirefoxProfile();

firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir","c:\\downloads");
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

WebDriver driver = new FirefoxDriver(firefoxProfile);//new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);

driver.navigate().to("http://www.myfile.com/hey.csv");

1
Đóng, nhưng không hoạt động tốt cho Firefox trên Ubuntu 12.04 kể từ ngày 17/8/2013. Thay đổi giá trị của thuộc tính "browser.helperApps.osystemAsk.saveToDisk" thành "text / csv, application / vnd.ms-excel" và nó sẽ hoạt động trên Ubuntu.
bakoyaro

2
Có thể là tên giá trị đã thay đổi, đây là từ hơn một năm.
dlopezgonzalez

1
Tôi đang sử dụng cùng một phương pháp để tự động lưu tệp nhưng nó không hoạt động. Phiên bản firefox của tôi là 20.0. Và tôi đang cố tải xuống các tệp pdf (sử dụng loại MIME-> ứng dụng / pdf, ứng dụng / x-pdf)
Yatin

3
Không phải là điều này không hoạt động với Content-Disposition: attachment. Firefox dường như luôn bật lên một hộp thoại trong trường hợp này!
Martin Höller

để tải file xls trong linux này làm việc cho tôi:setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
donfuxx

42

Tôi đã bị mắc kẹt với cùng một vấn đề, nhưng tôi đã tìm ra giải pháp. Tôi đã làm nó theo cách giống như blog này đã làm.

Tất nhiên đây là Java, tôi đã dịch nó sang Python:

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir",getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv")

browser = webdriver.Firefox(firefox_profile=fp)

Trong ví dụ của tôi, đó là một tệp CSV. Nhưng khi bạn cần nhiều hơn, sẽ có~/.mozilla/$USER_PROFILE/mimeTypes.rdf


3
Tôi đã thử điều này, nhưng nó có vẻ không hiệu quả với tôi. Hộp thoại lưu tệp vẫn hiển thị.
ealfonso

1
Cảm ơn, tùy chọn cuối cùng là clutch: "application / pdf"
user2426679 23/02/15

1
Tôi đang sử dụng cùng một phương pháp để tự động lưu tệp nhưng nó không hoạt động. Phiên bản firefox của tôi là 20.0. Và tôi đang cố tải xuống các tệp pdf (sử dụng loại MIME-> ứng dụng / pdf, ứng dụng / x-pdf)
Yatin

1
Xin cảm ơn @Akendo. Điều này đang hoạt động đối với tôi khi sử dụng python 3.4.3, selenium-2.52 và Firefox 44.
Igor

8

Ứng dụng Web tạo ra 3 loại cửa sổ bật lên khác nhau; cụ thể là

 1| JavaScript PopUps
 2| Browser PopUps
 3| Native OS PopUps [e.g., Windows Popup like Upload/Download]

Nói chung, các cửa sổ bật lên JavaScript được tạo bởi mã ứng dụng web. Selenium cung cấp một API để xử lý các cửa sổ bật lên JavaScript này, chẳng hạn như Alert.

Cuối cùng, cách đơn giản nhất để bỏ qua cửa sổ bật lên của Trình duyệt và tải xuống tệp được thực hiện bằng cách sử dụng cấu hình Trình duyệt; Có một số cách để làm điều này:

  • Thực hiện theo cách thủ công các thay đổi trên thuộc tính trình duyệt (hoặc)
  • Tùy chỉnh các thuộc tính của trình duyệt bằng cách sử dụng bộ hồ sơ

Phương pháp1

Trước khi bạn bắt đầu làm việc với cửa sổ bật lên trên cấu hình Trình duyệt, hãy đảm bảo rằng tùy chọn Tải xuống được đặt mặc định thành Lưu tệp.

(Mở Firefox) Công cụ> Tùy chọn> Ứng dụng

nhập mô tả hình ảnh ở đây

Phương pháp 2

Sử dụng đoạn mã dưới đây và chỉnh sửa bất cứ khi nào cần thiết.

FirefoxProfile profile = new FirefoxProfile();

String path = "C:\\Test\\";
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", path);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
profile.setPreference("browser.download.manager.showWhenStarting", false);
profile.setPreference("browser.download.manager.focusWhenStarting", false);  
profile.setPreference("browser.download.useDownloadDir", true);
profile.setPreference("browser.helperApps.alwaysAsk.force", false);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.download.manager.closeWhenDone", true);
profile.setPreference("browser.download.manager.showAlertOnComplete", false);
profile.setPreference("browser.download.manager.useWindow", false);
profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false);
profile.setPreference("pdfjs.disabled", true);
       
driver = new FirefoxDriver(profile);

4

Tôi đã phải đối mặt với cùng một vấn đề. Trong ứng dụng của chúng tôi, phiên bản FireFox được tạo bằng cách chuyển các Khả năng mong muốn như sau

driver = new FirefoxDriver(capabilities);

Dựa trên đề xuất của những người khác, tôi đã thực hiện các thay đổi của mình như

FirefoxProfile firefoxProfile = new FirefoxProfile();     
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");
driver = new FirefoxDrvier(firefoxProfile);

Điều này phục vụ mục đích nhưng không may là các thử nghiệm tự động hóa khác của tôi bắt đầu không thành công. Và lý do là, tôi đã loại bỏ các khả năng đã được thông qua trước đó.

Một số duyệt hơn trên mạng và tìm thấy một cách thay thế. Chúng ta có thể tự thiết lập hồ sơ trong các Khả năng mong muốn.

Vì vậy, mã làm việc mới trông giống như

DesiredCapabilities capabilities = DesiredCapabilities.firefox();

// add more capabilities as per your need.
FirefoxProfile firefoxProfile = new FirefoxProfile();        
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");

// set the firefoxprofile as a capability
capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile);
driver = new FirefoxDriver(capabilities);

3

Không biết, nhưng có lẽ bạn có thể kiểm tra nguồn của một trong các phần bổ trợ tải xuống Firefox.

Đây là nguồn cho một cái mà tôi sử dụng Thanh trạng thái tải xuống .


Cảm ơn, điều đó rất thú vị (nhưng chứng minh điều đó là không thể hoặc cực kỳ khó trừ khi tôi đang viết một phần mở rộng với các phần xul).
Andrey Shchekin

3

Hầu hết các trình duyệt (trong trường hợp của tôi là Firefox) chọn nút OK theo mặc định. Vì vậy, tôi đã quản lý để giải quyết điều này bằng cách sử dụng mã sau. Về cơ bản, nó sẽ nhấn enter cho bạn và tệp được tải xuống.

Robot robot = new Robot();

// A short pause, just to be sure that OK is selected
Thread.sleep(3000);

robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

3

Tôi gặp vấn đề tương tự, tôi không muốn truy cập Lưu Đối thoại.

Mã dưới đây có thể giúp:

    FirefoxProfile fp = new FirefoxProfile();
    fp.setPreference("browser.download.folderList",2);
    fp.setPreference("browser.download.manager.showWhenStarting",false);
    fp.setPreference("browser.helperApps.alwaysAsk.force", false);
    // Below you have to set the content-type of downloading file(I have set simple CSV file)
    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

Theo loại tệp đang được tải xuống, Bạn cần chỉ định loại nội dung.

Bạn có thể chỉ định nhiều loại nội dung được phân tách bằng ' ; '

ví dụ:

    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");

2

Thay vì kích hoạt hộp thoại tải xuống tệp gốc như vậy:

By DOWNLOAD_ANCHOR = By.partialLinkText("download");
driver.findElement(DOWNLOAD_ANCHOR).click();

Thay vào đó, tôi thường làm điều này để bỏ qua hộp thoại Tải xuống tệp gốc. Theo cách này, nó hoạt động trên TẤT CẢ các trình duyệt:

String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href");
File downloadedFile = getFileFromURL(downloadURL);

Điều này chỉ yêu cầu bạn triển khai phương pháp getFileFromURLsử dụng Apache HttpClient để tải xuống tệp và trả về tệp tham chiếu cho bạn.

Tương tự, nếu bạn tình cờ sử dụng Selenide , nó hoạt động theo cùng một cách bằng cách sử dụng download()chức năng tích hợp để xử lý tải xuống tệp.


Điều đó sẽ chỉ hoạt động đối với các tệp được liên kết tĩnh trong html, ví dụ: không phải một tệp tin được tạo dựa trên một yêu cầu bài đăng (hoặc tương tự).
Todor Minakov

Vâng, tỷ lệ có thể khác nhau. Thông thường, bạn sẽ có thể làm việc với các nhà phát triển của mình để tìm ra điều gì đó trong những trường hợp rìa đó.
djangofan

0

Tôi không hiểu mục tiêu của bạn, Bạn có muốn thử nghiệm của mình tự động tải xuống tệp khi thử nghiệm đang được thực thi, nếu có, thì Bạn cần sử dụng cấu hình Firefox tùy chỉnh trong quá trình thực thi thử nghiệm của mình.

Trong cấu hình tùy chỉnh, lần đầu tiên thực hiện kiểm tra theo cách thủ công và nếu hộp thoại tải xuống xuất hiện, hãy đặt nó Lưu nó vào Đĩa, cũng chọn hộp kiểm Luôn thực hiện hành động này sẽ đảm bảo rằng tệp tự động được tải xuống vào lần tiếp theo bạn chạy thử nghiệm của mình.


0

Ngoài ra bạn có thể thêm

      profile.setPreference("browser.download.panel.shown",false);

Để xóa danh sách tệp đã tải xuống được hiển thị theo mặc định và che một phần của trang web.

Tổng số cài đặt của tôi là:

        DesiredCapabilities dc = DesiredCapabilities.firefox();
        dc.merge(capabillities);
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setPreference("browser.download.folderList", 4);
        profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath());
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        profile.setPreference("browser.download.manager.focusWhenStarting", false);
        profile.setPreference("browser.download.useDownloadDir", true);
        profile.setPreference("browser.helperApps.alwaysAsk.force", false);
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.download.manager.closeWhenDone", true);
        profile.setPreference("browser.download.manager.showAlertOnComplete", false);
        profile.setPreference("browser.download.manager.useWindow", false);
        profile.setPreference("browser.download.panel.shown",false);
        dc.setCapability(FirefoxDriver.PROFILE, profile);
        this.driver = new FirefoxDriver(dc);

1
Xin chào Neil Ellis, Nhấp vào nút hình ảnh, "Xuất" sẽ mở ra một cửa sổ bật lên. Tải xuống tệp được kích hoạt từ cửa sổ bật lên và cửa sổ bật lên được đóng lại. Nếu có thể, vui lòng hướng dẫn tôi cách tải xuống tệp im lặng trong trường hợp này?
AVA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.