Используя Selenium и Firefox версии 40, как мне загрузить файл?

Старые методы загрузки файла через Selenium больше не работают.

Мой код:

    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.dir", os.getcwd())
    fp.set_preference("browser.download.folderList", 2)
    fp.set_preference("browser.download.manager.showWhenStarting", False)
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk",
                      "application/pdf")

    self.driver = webdriver.Firefox(firefox_profile=fp)
    self.longMessage = True

Однако диалоговое окно с файлом по-прежнему появляется. Я сделал довольно много включения и выключения полей, но после небольшого копания я обнаружил, что нет никаких различий между файлом prefs.js профиля Firefox по умолчанию, сгенерированным Selenium, и файлом prefs.js того, где я проверил вручную «Делайте это автоматически для файлов этого типа с этого момента» в диалоговом окне загрузки.

Однако файл mimeTypes.rdf меняется, в частности, добавляются следующие строки:

<RDF:Description RDF:about="urn:mimetype:handler:application/pdf"
               NC:alwaysAsk="false"
               NC:saveToDisk="true"
               NC:handleInternal="false">
<NC:externalApplication RDF:resource="urn:mimetype:externalApplication:application/pdf"/>

Однако я не знаю, как настроить собственный файл mimeTypes.rdf при создании нового профиля Firefox. У кого-нибудь есть идеи?

Чтобы предупредить любого, кто предложит мне просто указать URL-адрес загрузки, файл создается для пользователя, и мне нужно специально проверить, загружается ли файл .pdf на диск.


person Staunch    schedule 28.08.2015    source источник
comment
Я тоже очень усердно искал решение. Я нашел этот github.com/seleniumhq/selenium-google-code -issue-архив/проблемы/   -  person Indranil Gayen    schedule 04.01.2017
comment
Я использую Firefox версии 50.1.0. и Rселениум. Не удалось загрузить, так как появляется подсказка. Однако в некоторых случаях это работает. Я напишу ответ, переоценивая то же самое.   -  person Indranil Gayen    schedule 04.01.2017


Ответы (2)


Я пользователь R, поэтому просто публикую свое решение в R, используя RSelenium. Если вы не можете преобразовать то же самое в python, пожалуйста, дайте мне знать, я намекну на то же самое.

known_formats <- c("application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")


firefox_profile.me <- makeFirefoxProfile(list(marionette = TRUE,
                                              # this is for certificate issues [may be ignored]
                                              webdriver_accept_untrusted_certs = TRUE,
                                              webdriver_assume_untrusted_issuer = TRUE,
                                              # download related settings
                                              browser.download.folderList = 2L,
                                              browser.download.manager.showWhenStarting = FALSE,
                                              # put your path here but remember to give path like C:\\DirOfYourChoice and not C:\\DirOfYourChoice\\ [last \\ is not going to work]
                                              browser.download.dir = normalizePath("TestDL"),
                                              browser.helperApps.alwaysAsk.force = FALSE,
                                              browser.helperApps.neverAsk.openFile = paste0(known_formats, collapse = ","),
                                              browser.helperApps.neverAsk.saveToDisk = paste0(known_formats, collapse = ","),
                                              browser.download.manager.showWhenStarting = FALSE,
                                              # this is for marionette and related security
                                              "browser.tabs.remote.force-enable" = TRUE,
                                              pdfjs.disabled = TRUE))

remDr <- remoteDriver(remoteServerAddr = "localhost",
                      port = 4444,
                      browserName = "firefox",
                      extraCapabilities = firefox_profile.me)

remDr$open()

remDr$navigate("https://www.google.com/search?q=sample+xlsx")

remDr$findElement(using = "css selector", value = ".g:nth-child(1) a")$clickElement()

remDr$navigate("https://www.google.com/search?q=test+xls")

remDr$findElement(using = "css selector", value = ".g:nth-child(1) a")$clickElement()

Работает нормально со мной, я использую

Firefox 50.1.0 [while I'm writing this post]
Selenium [3.0.1]
R [3.3.2 (2016-10-31)]

Надеюсь, вы сможете портировать это на python. Просто попробуйте повторить настройки в firefox makeFirefoxProfile

Ссылка для дальнейшего понимания:-
Как скачать файлы с помощью Selenium
Настройки профиля Firefox в Selenium

person Indranil Gayen    schedule 04.01.2017

вы можете создать дополнительный метод для скачивания файлов из интернета по ссылке.

Пример из моего кода С#:

public Bitmap Image
        {
            get
            {
                string webPath = Element.GetAttribute("src");

                if (webPath != string.Empty)
                {
                    try
                    {
                        System.Net.WebRequest request =
                            System.Net.WebRequest.Create(webPath);

                        System.Net.WebResponse response = request.GetResponse();

                        System.IO.Stream responseStream = response.GetResponseStream();

                        Bitmap bitmapImg = new Bitmap(responseStream);

                        return bitmapImg;
                    }
                    catch (System.Net.WebException)
                    {
                    }
                }

                return new Bitmap(1,1);
            }
        }

Итак, как вы видите, в этом коде я получаю атрибут src из элемента изображения и загружаю его из браузера, чтобы получить абсолютно правильное растровое изображение (после этого я могу сохранить его на жесткий диск). Таким же образом вы можете скачивать любые файлы по ссылкам =)

person Andrew    schedule 28.08.2015
comment
Я пытался парировать этот ответ в своем исходном посте — файл генерируется, когда пользователь нажимает кнопку. У меня нет возможности заранее получить ссылку для скачивания. :( - person Staunch; 29.08.2015
comment
@Staunch, вы можете получить ссылку и скачать ее одним нажатием кнопки. В чем проблема? - person Andrew; 07.09.2015
comment
Как можно получить ссылку? Это javascript метод и ajax запрос. - person cprn; 02.08.2016