Скачать файл Диалог
Я использую Selenium с моей системой CI для автоматического тестирования моих различных приложений, одна из которых представляет собой веб-форму с загружаемой копией наших ответов (в виде динамически созданного PDF). Тест заключается в утверждении, что загружаемый файл PDF содержит правильные ответы (ответы на веб-форму). Моя проблема заключается в попытке обработать диалоговое окно загрузки для извлечения файла PDF (утверждение содержания PDF файла является правильным, выходит за рамки этого вопроса).
Я потратил некоторое время на поиски способов справиться с этим, несколько вещей, которые я нашел в любой релевантности, были AutoIT, изменение местоположения загрузки по умолчанию и автоматическое скачивание файлов, и просто утверждение ссылки работает без загрузки файла. К сожалению, моя ситуация исключает все три возможности.
- Я использую различные браузеры (исключая автоматические загрузки, поскольку некоторые браузеры этого не поддерживают).
- Я использую различные платформы (исключая AutoIT, приложение только для Windows).
- Содержимое в формате PDF динамически генерируется на основе предыдущих взаимодействий с приложением, тест заключается в том, чтобы утверждать, соответствует ли полученное содержимое ожидаемым значениям, поэтому просто проверить, существует ли ссылка, недостаточно.
Поскольку представленное диалоговое окно загрузки управляется ОС, я не уверен, можно ли использовать Selenium для того, что я намерен, однако я подумал, что сначала попрошу, чтобы узнать, знает ли кто-нибудь какие-либо решения, используя Selenium, или вместо этого может рекомендовать некоторые другие приемлемые способы тестирования?
Ответы
Ответ 1
Насколько я знаю, вы не можете использовать селен для этого по причинам, которые вы заявили сами. Тем не менее, я думаю, что лучший способ приблизиться к этому - загрузить созданный pdf напрямую без селена. Поскольку вы знаете его URL, вы можете использовать подход, описанный в в этой статье. В нем описывается использование "Powder-Monkey" для выполнения именно того, что вы хотите сделать.
Ответ 2
Это действительно раздражающая проблема. Однако я мог бы выяснить, как решить эту проблему для Firefox. Возможно, вы можете найти аналогичное решение для других браузеров.
В принципе, вы должны заставить браузер загружать файл, не запрашивая его. Вы можете сделать это, загрузив специально созданный профиль.
from selenium import webdriver
myprofile = webdriver.FirefoxProfile('./profile')
myprofile.set_preference('browser.download.dir', '/tmp/my_downloads_folder')
myprofile.set_preference('browser.download.folderList', 2)
myprofile.set_preference('pdfjs.migrationVersion', 1);
browser = webdriver.Firefox(fp)
Помимо загрузки профиля, мы также определяем папку для загрузки и отключим плагин pdfjs
.
В папке ./profile
у нас есть файл mimeTypes.rdf
, например:
<?xml version="1.0"?>
<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#"
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<RDF:Description RDF:about="urn:mimetype:application/pdf"
NC:value="application/pdf"
NC:editable="true">
<NC:handlerProp RDF:resource="urn:mimetype:handler:application/pdf"/>
</RDF:Description>
<RDF:Description RDF:about="urn:mimetype:handler:application/pdf"
NC:alwaysAsk="false"
NC:saveToDisk="true"
NC:handleInternal="false">
<NC:externalApplication RDF:resource="urn:mimetype:externalApplication:application/pdf"/>
</RDF:Description>
</RDF:RDF>
Надеюсь, это поможет вам.