Невозможно получить доступ к элементам окна предварительного просмотра PDF Chrome с помощью Selenium - PullRequest
1 голос
/ 29 апреля 2020

У меня есть кнопка печати в моем приложении. Эта кнопка печати открывает PDF в новом окне. В верхней части этого окна находится значок «Печать», по которому можно щелкнуть, чтобы открыть окно предварительного просмотра печати Chrome, в котором можно выбрать параметр «Сохранить как PDF» для сохранения файла PDF.

Я хотел бы проверить этот поток в селене.

--- Я нажимаю кнопку «Печать» на своей веб-странице. Это открывает новое окно Chrome с PDF

driver.findElement(By.cssSelector("ID")).click();

--- Я переключаюсь на недавно открытое окно Chrome

driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());

Я вижу в журналах, что селен действительно переключается на новое окно.

--- Я пытаюсь открыть элемент нового Chrome окна

driver.findElement(By.cssSelector("viewer-pdf-toolbar"))

Вот в чем проблема. Selenium не может взаимодействовать с этим недавно открытым окном и не может найти этот элемент. Когда я осматриваю недавно открытое окно, я вижу следующую структуру DOM -

<body> 
    <viewer-pdf-toolbar id="toolbar"></viewer-pdf-toolbar>
    <div id="sizer" style="width: 735px; height: 1092px;"></div>
    <viewer-password-screen id="password-screen"></viewer-password-screen>
    ...
    ..
    .
</div>

Элемент, который я ищу, существует в структуре DOM, и я могу получить к нему доступ через консоль, но не могу получить к нему доступ с помощью Selenium , Вы можете просмотреть эту DOM, открыв любой файл PDF в браузере Chrome и проверив окно. Любые идеи, почему это происходит?

Примечание. Когда загружается новое окно, на секунду или две отображается «Печать, подождите», а затем загружен файл PDF. Не уверен, что эта информация имеет отношение к проблеме здесь.

Дополнительная информация -

В режиме отладки после того, как драйвер переключился на новое окно PDF, которое я оценил - driver.getCurrentUrl() - этот URL правильный URL-адрес, отображаемый в адресной строке окна предварительного просмотра. Это означает, что мой драйвер находится в правильном окне.

Но когда я выполняю driver.getPageSource - я получаю следующий вывод

<html>
<head>
</head>
<body style="height: 100%; width: 100%; overflow: hidden; margin:0px; background-color: rgb(82, 86, 89);">
<embed name="XXXXXXD474B71424EC89403FB4FA75CF" style="position:absolute; left: 0; top: 0;" width="100%" height="100%" src="about:blank" type="application/pdf" internalid="XXXXXXD474B71424EC89403FB4FA75CF"></body>
</html>

Так что driver видит это как источник страницы тогда как когда я делаю inspect в том же окне, я вижу другой DOM. Почему это происходит? Chrome заменяет тег <embed> окончательным DOM? Как селен может быть осведомлен об этом изменении?

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 30 апреля 2020

Индуцируйте WebDriverWait () и ждите visibilityOfElementLocated () и следующего селектора css.

new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#toolbar")));

Обновление :

new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.tagName("body")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...