Скачать файл Диалог

Я использую 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>

Надеюсь, это поможет вам.