2013-08-01 78 views
10

Tôi đang sử dụng Selenium với hệ thống CI để tự động kiểm tra các ứng dụng khác nhau của mình, một trong số đó là biểu mẫu web có bản sao câu trả lời của chúng tôi (dưới dạng PDF được tạo động). Bài kiểm tra là để khẳng định tệp PDF có thể tải xuống chứa các câu trả lời đúng (các câu trả lời được đưa ra trên biểu mẫu web). Vấn đề của tôi là cố gắng xử lý hộp thoại tải xuống để truy xuất tệp PDF (khẳng định nội dung của tệp PDF chính xác nằm ngoài phạm vi của câu hỏi này).Tải xuống Hộp thoại Tệp

Tôi đã dành thời gian xem xét cách xử lý, một vài điều tôi đã tìm thấy có liên quan là AutoIT, thay đổi vị trí tải xuống mặc định & tự động tải xuống tệp trình duyệt và chỉ asserting the link works without downloading the file. Thật không may, tình hình của tôi loại trừ tất cả ba khả năng.

  1. Tôi đang sử dụng nhiều trình duyệt khác nhau (loại bỏ tải xuống tự động vì một số trình duyệt không hỗ trợ tính năng này).
  2. Tôi đang sử dụng nhiều nền tảng khác nhau (loại bỏ AutoIT, một ứng dụng chỉ dành cho Windows).
  3. Nội dung trong PDF được tạo động dựa trên tương tác trước đó với ứng dụng, kiểm tra là để xác định xem nội dung được tạo có khớp với giá trị dự kiến ​​hay không, vì vậy chỉ cần kiểm tra xem liên kết có tồn tại không đủ không.

Vì hộp thoại tải xuống được trình bày bởi hệ điều hành, tôi không chắc liệu có thể sử dụng Selenium cho những gì tôi dự định hay không, tuy nhiên tôi nghĩ tôi sẽ hỏi trước xem có ai biết giải pháp nào không sử dụng Selenium, hoặc thay vào đó có thể đề nghị một số phương tiện thử nghiệm được chấp nhận khác?

+0

Nếu câu trả lời của luksch không đủ cho bạn, tôi có một ý tưởng khác. Nếu bạn có thể đánh hơi và đăng các tham số Http/Session bạn sẽ có bằng một tải xuống tương tác bình thường? Bạn có thể kiểm tra liên kết mà không cần tải xuống nếu bạn xây dựng các gói và quản lý phiên của bạn (nghĩa là cookie/cache - bất kỳ nơi nào tương tác trước đó được lưu). –

+0

Làm cách nào để mở tệp PDF trong chính trình duyệt? – Manu

Trả lời

6

Theo như tôi biết bạn không thể sử dụng selen cho điều đó, vì những lý do bạn tự tuyên bố. Tuy nhiên, tôi nghĩ cách tốt nhất để tiếp cận điều này là tải xuống bản pdf được tạo trực tiếp mà không có selen. Vì bạn biết url của nó, bạn có thể sử dụng cách tiếp cận được nêu trong this article. Nó mô tả việc sử dụng "Powder-Monkey" để làm chính xác những gì bạn muốn làm.

3

Đây thực sự là một vấn đề khó chịu. Tuy nhiên, tôi có thể tìm ra cách giải quyết nó cho Firefox. Có lẽ bạn có thể tìm thấy một giải pháp tương tự cho các trình duyệt khác.

Về cơ bản, bạn phải buộc trình duyệt tải xuống tệp mà không yêu cầu. Bạn có thể làm điều đó bằng cách tải một hồ sơ đặc biệt crafted.

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) 

Bên cạnh việc tải cấu hình, chúng tôi cũng xác định thư mục tải xuống và tắt plugin pdfjs.

Trong ./profile thư mục, chúng ta có một tập tin mimeTypes.rdf như thế này:

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

Tôi hy vọng nó sẽ giúp bạn.