Проблема с загрузкой файлов после обновления версий

После обновления версий: chromium и chromedriver с 104.* до 114.0.5735.90(или выше), selenium и selenide до 4.12.0 и 6.18.0. Появилась проблема с загрузкой файлов при нажатии по кнопке.

Сценарий:

  1. Переход по ссылке на новую страницу, на которой есть кнопка “скачать”
  2. Нажимаю кнопку “скачать”
    ОР: просто загружается файл (как и раньше)
    ФР: ссылка для загрузки файла открывается как новая страница с ошибкой “Не удается получить доступ к сайту” и файл скачивается 2 раза вместо одного.
    :warning: если в режиме дебага вернуться на предыдущую страницу и повторно выполнить код шага №2, то отработает как ожидается.
    :warning: если автотест дойдёт до шага №2 и нажать на кнопку руками, то результат так же будет ожидаемым. проблема только при выполнении кода, и не важно какого, selenide / selenium / js

Пока не могу понять в чем дело, может баг браузера самого, может в ChromeOptions, перечитываю их, но не могу заметить подходящую.

Список используемых мною настроек драйвера:

    HashMap<String, Object> chromePrefs = new HashMap<>();
    chromePrefs.put("profile.default_content_settings.popups", 0);
    chromePrefs.put("safebrowsing.enabled", true);
    chromePrefs.put("download.prompt_for_download", false);
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("prefs", chromePrefs);
    options.addArguments("start-maximized");
    options.addArguments("--force-device-scale-factor=1");
    options.addArguments("--remote-allow-origins=*");
    options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});   
    options.addArguments("--no-sandbox"); 
    options.addArguments("--disable-dev-shm-usage"); 
    options.addArguments("--disable-browser-side-navigation"); 
    options.addArguments("--disable-gpu");

Запускал на винде и на линуксе, одинаково.

А зачем вы все эти опции сами задаёте? Селенид их сам прописывает какие надо.
Попробуйте их убрать для начала.

P.S. По существу очень сложно что-то ответить. Попробуйте почитать внимательно полный лог селенида. Ну и показать ваш код, который скачивает файл.

1 лайк

Да, я при исследовании опций сегодня это тоже обнаружил, что без их указания работает)) Но проблему, это не решило

Элемент страницы такой:
<a href="ссылка на документ" class="link">Скачать</a>
В коде просто нажимаю selenideElement.shouldBe(Condition.enabled, duration).click();
После чего происходит это:


Через команды селениума тоже пробовал обратиться к элементу, всё так же. Как я вижу, при нажатии запрос выполняется без заголовков и не указывается его тип… после чего он выполняется повторно 2-4 раза, успешно со всеми заголовками.

В 104 версии хромиума данной проблемы не было. Кроме 114, пробовал использовать более новую версию (117), тоже самое. Причем эта проблема есть только с этой кнопкой, которая находится в стареньком давно написанном юае приложения. С аналогичной кнопочкой в новой форме, не наблюдаю такую проблему.

Если со страницы с ошибкой вернуть на предыдущую страницу с кнопкой и выполнить код нажатия повторно, то проблема не воспроизведётся. Это немного сбивает столку… Обновление страницы или пауза перед нажатием, тоже не помогли.
Если автотест доходит до этой кнопки, и просто в консоли браузера выполнить команду document.querySelector("a").click() то проблема воспроизводится тоже.

Похоже, что проблема в неактуальности тестируемого приложения под новые версии браузера. Похоже, что требуется доработка тестируемого приложения.
Если доработку делать не будут, то буду думать костыль, или опускать версию браузера ниже, пока проблема не пропадёт. Может окажется, что проблема все же в самом драйвере, и с новыми версиями хрома она пропадёт.

Как минимум у меня вопрос по этой строчке:
selenideElement.shouldBe(Condition.enabled, duration).click();

Зачем вы вызываете метод click? Вам же нужно скачать файл - для этого есть метод download:

File file = selenideElement.shouldBe(enabled, duration).download();

См. https://youtu.be/k0A8HFWV_iE

1 лайк

Посмотрел ваше видео, спасибо большое, всё очень понятно и наглядно. Понравилось, что вы использовали чатджипити в качестве подопытного :slight_smile:

Мне click() внушает больше уверенности, потому что всё прозрачно. Не вижу чтобы метод download() делал как таковое нажатие, думаю что он может не выявить баги связанные с юайными ивентами при нажатии. Когда-то пробовал использовать его со сложным юаем ангулярным - он так просто не работал, надо было настраивать прокси… В общем решил, что проще просто click() и не запариваться.

Удивительно то, что метод download() решает мою проблему! Как минимум до момента, пока либо гугл, либо мои коллеги не исправят её для обычного клика. В дальнейшем буду экспериментировать и искать больше применения для метода download(). Думаю, что есть ситуации, когда подойдёт download(), а когда следует через click().

Видимо, я чего-то не понимаю, но что значит “не запариваться”?
После клика ведь вам придётся ещё найти скачанный файл, а это офигеть как запариваться!

А вот $.download() возвращает скачанный файл, его не надо нигде искать. Вот это как раз “не запариваться”!

P.S. Кстати, оба варианта $.download(FOLDER) и $.download(PROXY) работают как раз прозрачно: тупо кликают кнопку и ждут, пока файл скачается. Отличаются они только тем, как именно они ищут файл.

В моём случае, была сложная юайная кнопка, и после нажатия выполнялась куча запросов, среди которых где-то в третьем загружался файл… так просто не работало. Надо было “запариться” чтобы заработало. Может в новой версии иначе, я пока не проверял.

Не могу найти где селенид делает нажатие в download() :frowning:

  1. Метод $.download(FOLDER) вообще не волнует, сколько у тебя там запросов. Он тупо ищет файл в папке. Должен работать.
  2. С методом $.download(PROXY) чуть сложнее: он как раз пытается найти среди запросов нужный. Но ты ему можешь легко помощь, задав доп.параметром имя или расширение файла:
    File f = $.download(withName("hello_world.txt"));
1 лайк