2013-08-01 27 views
10

Używam Selenium z moim systemem CI do automatycznego testowania moich różnych aplikacji, z których jednym jest formularz internetowy z pobieralną kopią naszych odpowiedzi (jako dynamicznie generowany plik PDF). Test polega na stwierdzeniu, że pobrany plik PDF zawiera poprawne odpowiedzi (odpowiedzi podane w formularzu internetowym). Mój problem polega na próbie obsługi okna dialogowego pobierania w celu pobrania pliku PDF (upewnienie się, że zawartość pliku PDF jest poprawna wykracza poza zakres tego pytania).Pobierz okno dialogowe pliku

spędziłem patrząc dookoła na sposób sobie z tym poradzić, to kilka rzeczy znalazłem jakiegokolwiek znaczenia był AutoIT, zmieniając domyślne pobrań lokalizację & dokonywania pobierania plików przeglądarka automatycznie, a tylko asserting the link works without downloading the file. Niestety, moja sytuacja wyklucza wszystkie trzy możliwości.

  1. Używam różnych przeglądarek (wyklucza automatyczne pobieranie, ponieważ niektóre przeglądarki tego nie obsługują).
  2. Używam różnych platform (wykluczając AutoIT, aplikację tylko dla systemu Windows).
  3. Zawartość w pliku PDF jest generowana dynamicznie w oparciu o poprzednie interakcje z aplikacją, test polega na stwierdzeniu, czy wygenerowana zawartość pasuje do oczekiwanych wartości, więc sprawdzenie, czy link istnieje, nie wystarczy.

Ponieważ prezentowane okno dialogowe pobierania jest zarządzane przez system operacyjny, nie jestem pewien, czy możliwe jest korzystanie z Selenium w zamierzeniach, ale pomyślałem, że najpierw zapytam, czy ktoś zna jakieś rozwiązania używając Selenium, czy zamiast tego może zalecić inne akceptowalne sposoby testowania?

+0

Jeśli odpowiedź letscha nie jest dla ciebie wystarczająca, mam inny pomysł. Jeśli możesz powąchać i opublikować parametry Http/Session, które można uzyskać, pobierając normalną interakcję? Możesz sprawdzić link bez pobierania, jeśli skonstruujesz pakiety i zarządzisz sesją (np. Pliki cookie/pamięć podręczną - gdziekolwiek poprzednia interakcja została zapisana). –

+0

Co powiesz na otwarcie pliku PDF w samej przeglądarce? – Manu

Odpowiedz

6

O ile wiem, nie można do tego celu stosować selenu, z powodów podanych przez siebie. Myślę jednak, że najlepszym sposobem podejścia jest pobranie wygenerowanego pliku PDF bezpośrednio bez selenu. Ponieważ znasz jego adres URL, możesz zastosować podejście opisane w this article. Opisuje użycie "Powder-Monkey", aby zrobić dokładnie to, co chcesz robić.

3

Jest to naprawdę irytujący problem. Jednak mogłem dowiedzieć się, jak rozwiązać go w Firefoksie. Może znajdziesz podobne rozwiązanie dla innych przeglądarek.

Zasadniczo musisz wymusić przeglądarkę, aby pobrać plik bez pytania o niego. Możesz to zrobić, ładując specjalnie spreparowany profil.

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) 

Poza załadowaniem profilu, możemy również określić folder, pobieranie i wyłączyć wtyczkę pdfjs.

W ./profile folderze mamy plik mimeTypes.rdf takiego:

<?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> 

Mam nadzieję, że pomaga.