Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

[Resolved] Подскажите, как заставить chromedriver не закачивать файл (python)


(Виталий Коряков) #1

Добрый день.
Возможно ли настроить chrome profile, что бы файл, который закачивается при нажатии на кнопку - не закачивался? Тоесть запретить закачку файлов вообоще?
Спасибо.


(Artur Korobeynyk) #2

А может просто использовать HEAD запрос к файлу, если сервер позволяет? В идеале HEAD запросы конечно должны быть запрещены из-за того что они добавляют дыру в безопасности, но это мало кто делает, так что возможно у вас есть шанс.


(heartwilltell) #3

Я повангую немного - у вас очевидно есть какой-то download page при переходе на который закачка начинается автоматически?
У меня просто аналогичная ситуация, и я тупо забил. Качает и качает, просто в конце каждого джоба где это присутствует - запускаю клинап скрипт :slight_smile:


(Виталий Коряков) #4

Забить нельзя, так как проверяются дестяки страниц с автоматическим даунодом.


(heartwilltell) #5

Ну тут либо использовать прокси и блокать все данлоад линки на ее уровне, либо пытаться заэксекутить джаваскрипт первее скрипта загрузки и подменять линку на пустую


(Виталий Коряков) #6

Есть вариант с настройками Chromeprofile, но какие, я пока не разобрался.


(Stan) #7

@VitaliyKoryakov
для хрома в преференсы надо всего два параметра указать

   profile.default_content_settings.popups 0
   download.default_directory "/tmp/special_dir/"

если где-то эта директория уже установлена, то надо еще передать

   download.directory_upgrade true

(Виталий Коряков) #8

profile.default_content_settings.popups 0 - запрещает закачку файлов?
Тогда зачем указывать директорию для закачки?
Больше похоже на то, что дизейблит попап, спрашивающий про закачку?


(Artur Korobeynyk) #9

В линуксе можно писать файлы в /dev/null . Подходит?


(Виталий Коряков) #10

Нет, винда )


(Stan) #11

если винда, то

some.exe > NUL

profile.default_content_settings.popups запрещает показывать диалог, который спрашивает про закачку


(Виталий Коряков) #12

С попапом понятно.
А вот тут не совсем понял, что вы имели в виду


(Stan) #13

Это была попытка ответить сразу на два комментария. На самом деле есть полукостыльный вариант, только что попробовал. Задал несуществующую папку для даунлоуда через download.default_directory, файл начал скачиваться, но выдал ошибку уже в менеджере загрузок. То есть с точки зрения самого сайта, загрузка инициализировалась. С точки зрения твоей логики, как я понял, это самый разумный вариант.


(Виталий Коряков) #14

Не совсем подходит такой вариант…
Суть в том. что скрип проходит по страницам быстро, и проверяет всего 1 элемент. Если сайт загрузился быстро, и проверка поршла так же быстро - загрузка не успевает начатся, и загружается вторая страница и т д
Если же страница более тяжелая, то загрузка успевает начаться, и начинаются карусели.
Так вот что бы не было таких вот неоднозначностей, возник вопрос, а можно ли вообще удалить загрузку на уровне браузера в Вебдрайвере?
Вариант ждать загрузки файла для всех страниц - не подходит, так как затратный по времени. Тест будет пол часа проходить.
Если же не существует способа отключить загрузку файла, то будем думать что то другое.


(Stan) #15

Так, в случае, если выставить несуществующую директорию, загрузка начинается, и моментально же заканчивается, в чем минусы этого подхода?


(Виталий Коряков) #16

А поделитесь кодом пжл.
Видимо что то не то делаю, так как .crdownload файлы все равно закачиваются в downloads

chromeOptions = webdriver.ChromeOptions()
prefs = {"download.default_directory": "/some/path"}
chromeOptions.add_experimental_option("prefs", prefs)

(Stan) #17

Я, к сожалению, пишу на js/webdriverio. Поэтому у меня это выглядит так (добавляю преф в capabilities):

   client = webdriverio.remote({
       desiredCapabilities: {
           browserName: 'chrome',
           'chromeOptions': {
               'prefs': {
                  'download.default_directory': '/idontexist/', 
                  'download.directory_upgrade': true,
                  'profile.default_content_settings.popups': 0
                }
           }
       },
       logLevel: 'silent'
   });

я так понимаю, у тебя это должно быть как-то так (поправьте, кто немного больше в теме):

   HashMap<String, Object> chromePrefs = new HashMap<String, Object>();

   chromePrefs.put("download.default_directory", "/idontexist/");
   chromePrefs.put("download.directory_upgrade", true);
   chromePrefs.put("profile.default_content_settings.popups", 0);

   options.setExperimentalOptions("prefs", chromePrefs);
   DesiredCapabilities capabilities = DesiredCapabilities.chrome();
   capabilities.setCapability(ChromeOptions.CAPABILITY, options);

PS не сразу заметил что у тебя питон, только когда отписался уже.


(Виталий Коряков) #18

Хм, в общем сделал так

    chrome_profile = webdriver.ChromeOptions()
    profile = {"download.default_directory": "C:\SeleniumTests\SomeFolder",
               "download.prompt_for_download": False,
               }
    chrome_profile.add_experimental_option("prefs", profile)
    self.driver = webdriver.Chrome('chromedriver.exe', chrome_options=chrome_profile)

Эта гадина создает несуществующую папку, и скидывает туда весь хлам
https://space.zeo.net/g/2uojb
Создаются временные файлы.


(Stan) #19

Попробуй передать “NUL” вместо папки? или несуществующий диск, несуществующий путь, например “M:\blabla”. У, меня, к сожалению, в данный момент нет windows с развернутой рабочей средой на нем. В идеале он не сможет создать папку, в которой нет доступа (или не хватает прав, или сам путь просто не может существовать).


(Виталий Коряков) #20

Да! Получилось.
Спасибо за советы.
Можно закрывать тему )