t.me/atinfo_chat Telegram группа по автоматизации тестирования

Считывание контента PDF файла C# WebDriver

Теги: #<Tag:0x00007fd768a286f8> #<Tag:0x00007fd768a285b8> #<Tag:0x00007fd768a284c8> #<Tag:0x00007fd768a28400> #<Tag:0x00007fd768a28310>

Проблема (Вопрос) заключается в том, что надо считать контент PDF файла. Selenium C# тесты запускаются на Jenkins (Windows Server) и ранятся в докер контейнере с Chrome через Selenoid (Ubuntu Server).

Локально у себя на машине я знаю как это сделать: сохранить pdf файл у себя на Windows машине и считать его или открыть pdf файл в отдельной вкладке и сделать Ctrl+A, Ctrl+C и считать текст с clipboard. А вот как сделать это в докер контейнере не знаю.

Пробовал тоже Ctrl+A, Ctrl+Shift+C и считать текст с clipboard, но ничего не вышло.
Как и куда скачать pdf-файл и считать его не знаю, поскольку тесты ранятся на Windows сервере и доступ будет к папкам только с Windows сервера.

Кто сталкивался с такой проблемой и имеет решение?

так вы определитесь, где тесты запускаются, в контейнере или на виндовс сервере

если в контейнере, то скачивайте файл в какой-нибудь volume каталог, и оттуда уже вычитывайте содержимое

Я наверное неправильно объясняюсь. Исполняемый файл находится на Windows Server. Там же находится Jenkins. Тесты выполняются с помощью RemoteDriver подключаясь к Selenoid на Ubuntu Server в Chrome докер контейнере.
Объясните, что значит volume каталог? Можно пример?

сохраните pdf локально любым доступным вам способом и
попробуйте извлечь из него текст используя pdfbox https://pdfbox.apache.org -

Сергей, спасибо за совет, но в заголовке написано, что проект C#, а вы даете библиотеку Java. Вопрос не стоит, как прочитать текст из файла. Вопрос стоит, можно ли скопировать содержимое pdf файла на закладке в clipboard или куда сохранить файл и как к нему доступиться?

volume каталог - это каталог, общий между контейнером и хост тачкой

вам нужно в контейнер прокинуть этот вольюм, тестом скачивать файл в него, и уже дальше кодом работать с этим файлом

Владислав, если Вас не затруднит, могли бы немного рассписать, какие комманды нужно будет выполнить и как доступится с Windows сервера с Jenkins к этой папке?
Пока нашел решение, как скопировать данные с clipboard докер контейнера. Но это больше костыли. Правильнее было б скачать файл и считать его.
Делаю клик на табе с документом, Ctrl+A, Ctrl+Shift+C, дальше получаю ответ с запроса к clipboard.

               new Actions(driver).MoveToElement(driver.FindElement(By.TagName("body")), 100, 100)
                    .Click()
                    .Perform();
           
                new Actions(driver).KeyDown(Keys.Control)
                  .SendKeys("a")
                  .KeyUp(Keys.Control)
                   .Perform();

                new Actions(driver).KeyDown(Keys.Control)
                    .KeyDown(Keys.Shift)
                    .SendKeys("c")
                    .KeyUp(Keys.Control)
                    .KeyUp(Keys.Shift)
                    .Perform();
               //сессия Selenoid
                string sessionId = ((RemoteWebDriver)driver).SessionId.ToString();
               //адресс к Selenoid clipboard 
               //http://selenoid-host.example.com:4444/clipboard/f2bcd32b-d932-4cdc-a639-687ab8e4f840
                string url = "http://selenoid-host.example.com:4444/clipboard/" + sessionId;

                using (var wb = new WebClient())
                {
                    text = wb.DownloadString(url);
                }

@ Oleksandr_Pushchalo

вроде имеется
PDFsharp

A .NET library for processing PDF

по поводу получегия файла докумена - есть ссылка со страницы которую вы тестируете ? она что - защищена и требует пользовательской сессии чтобы получить файл ?

Да, Сергей. Нужно залогиниться, чтобы получить файл. И файл сам по себе не хранится и генерируется.

урл значит знаете
посмотрите через дев консоль как запрашивается документ страницей - какие заголовки
куки наверное
и скачайте прямым HttpRequest

Привет.
Давай по порядку
Скачать файл с селеноида, как это сделать:

  1. Установить парметры для профиля (нужно гуглить для C# приведу пример для Джавы)
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.setExperimentalOption(“prefs”, new HashMap<String, Object>(){
    {
    put(“profile.default_content_settings.popups”, 0);
    put(“download.default_directory”, “/home/selenium/Downloads”);
    put(“download.prompt_for_download”, false);
    put(“download.directory_upgrade”, true);
    put(“safebrowsing.enabled”, false);
    put(“plugins.always_open_pdf_externally”, true);
    put(“plugins.plugins_disabled”, new ArrayList(){
    {
    add(“Chrome PDF Viewer”);
    }
    });
    }
    });

WebDriver driver = new RemoteWebDriver(new URL(“http://localhost:4444/wd/hub”), chromeOptions);
driver.navigate().to(“http://example.com/myfile.odt”);
2. Добавить где-то в тестах хранения сессии когда поднимаеться браузер
3. Добавить скачивание файла из поднятого контейнера (до закрытия сессии)
http://selenoid-host.example.com:4444/download/f2bcd32b-d932-4cdc-a639-687ab8e4f840/myfile.txt

Сам контент файла:
любая парсилка pdf на C# - и у тебя есть контент

если будут именно вопросы к доступу к файлу, и кускам кодам, стучись в ЛС

@ crazymakcter[Maksym Vertebnyi](https://automated-testing.info/u/crazym heaakcter)

вам может быть интересно узнать что похоже в докере headless chromium alpine сохранение работает но пишет в текущую директорию a не туда куда скажут :


	@Test
	public void downloadPDF() {
		url = "http://www.africau.edu/images/default/sample.pdf";
		driver.get(url);
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
		}
		File f = new File((downloadDirectory != null ? downloadDirectory : "/tmp") + "/" + "sample,pdf");
		assertThat(f.exists(), is(false));
		file = new File(System.getProperty("user.dir") + "/" + "sample.pdf");
		assertThat(file.exists(), is(true));
	}
docker run -it -v "$PWD/demo.selenium":/demo -w /demo $IMAGE mvn clean test ; 
CONTAINER=$(docker container ls -a |grep 'basic-maven-chromium' | head -1 | cut -f1 -d ' '); docker container start $CONTAINER;docker exec -it $CONTAINER sh -c "find / -iname '*pdf' 2>/dev/null"
fe728cfc1b7e
/demo/sample.pdf
1 Симпатия

Спасибо, не знал. Сейчас не пишу автотесты для UI, но в будущем пригодиться.