Не работает тест для скачивания pdf файла в Selenide

Задание было такое что надо проверить авторизацию на платформе, далее скачать PDF файл и в нем найти совпадение по тексту, тест зависает на скачивании файла, не могу понять в чем дело
Код

import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.logevents.SelenideLogger;
import io.qameta.allure.Step;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

import static com.codeborne.selenide.Condition.visible;
import static com.codeborne.selenide.Selenide.*;

public class Kpfu {
    @Before
    public void setUp() {
        // добавляем слушателя AllureSelenide
        SelenideLogger.addListener("AllureSelenide", new AllureSelenide().screenshots(true).savePageSource(false));
    }

    @After
    public void tearDown() {
        // удаляем слушателя AllureSelenide
        SelenideLogger.removeListener("AllureSelenide");
    }

    @Test
    public void testKpfu() throws IOException {
        open("http://kpfu.ru");

        $x("//div[@class='service-links']//a[@class ='lk-link']").click();

        login();

        documentsSection();

        downloadDocument();

        openFilesTab();

        downloadPdf();
    }

    @Step("Вводим логин и пароль")
    private void login() {
        $x("//div[@class='modal_body']//input[@name ='p_login']").setValue("SOIgnatev@stud.kpfu.ru");
        $x("//div[@class='modal_body']//input[@type ='password']").setValue("kngowjn5x");
        $x("//div[@class='modal_body']//input[@type ='submit']").click();
    }

    @Step("Переходим в раздел 'Документы'")
    private void documentsSection() {
        $x("//div[@class='left-half']//a[@href='SITE_STUDENT_SH_PR_AC.offor_document?p_menu=14&p_type_menu_open=151#tab151']").click();
    }

    @Step("Переходим в подраздел документов")
    private void downloadDocument() {
        $x("//div[@class='container clearfix']//a[@href='SITE_STUDENT_SH_PR_AC.download_document?p_menu=16']").click();
    }

    @Step("Открываем вкладку 'Файлы'")
    private void openFilesTab() {
        $x("//div[@class='left mCustomScrollbar _mCS_1 mCS_no_scrollbar']//a[@href='#tab2']").click();
    }

    @Step("Кликаем на ссылку для скачивания PDF-файла")
    private void downloadPdf() throws IOException {
        
        // Ожидаем появления элемента
        $("a.download").shouldBe(visible);
        // Кликаем на ссылку для скачивания PDF-файла
        $("a.download").click();
        String fileName = $("a.download").download().getName();

        // Открываем скачанный файл
        PDDocument document = PDDocument.load(new File(fileName));
        // Проверяем наличие заголовка "ОБУЧАЮЩИМСЯ"
        PDDocument firstPage = document;
        String text = new PDFTextStripper().getText(firstPage);
        if (!text.contains("ОБУЧАЮЩИМСЯ")) {
            throw new AssertionError("Заголовок 'ОБУЧАЮЩИМСЯ' не найден в PDF файле");
        }

        // Закрываем документ
        document.close();
    }

}

Поначалу думал дело в том, что элемент не успевает появляться на странице, добавил метод shoulbe(visible), но все равно безрезультатно

Выдает вот такую ошибку
Element should be visible {a.download}
Element: ‘
Actual value: hidden

Ну он же вам ответил - что такой элемент hidden, и поэтому на него нельзя кликнуть
p.s. Логин и пароль несекьюрно выкладывать)

Возможно ли каким нибудь образом скачать указанный файл? Второй день ломаю голову над этим

Скиньте скрин dom для этой страницы и кнопки через которое идет скачивание, иначе не сказать

Все справился с ситуацией, как раньше до этого не додумался, спасибо что навели на верную мысль )

Вообще-то вам стоило бы упростить код для скачивания файла. Не нужно и кликать, и вызывать метод “download”.

Вот эти строки:

        // Ожидаем появления элемента
        $("a.download").shouldBe(visible);
        // Кликаем на ссылку для скачивания PDF-файла
        $("a.download").click();
        String fileName = $("a.download").download().getName();

        // Открываем скачанный файл
        PDDocument document = PDDocument.load(new File(fileName));

Можно заменить на:

    // Кликаем на ссылку для скачивания PDF-файла
    File pdfFile = $("a.download").download();

    // Открываем скачанный файл
    PDDocument document = PDDocument.load(pdfFile);

Подробонее о скачивании файлов здесь: Как скачать файл в Selenide - YouTube

P.S. А ещё для проверки самого PDF удобно взять библиотеку GitHub - codeborne/pdf-test: PDF Test

1 лайк

А если открывается пдф файл на новой вкладке, как его скачать?

Селенид при открытии браузера специально задаёт вебдрайверу такие опции, чтобы PDF скачивался, а не отккрывался в новой вкладке. Так что этой проблемы нет (если только вы сами не запускаете браузер со своими опциями).