Używam Watir-Webdriver z Firefoksem i metody zalecanej na stronie watirwebdriver.com do automatyzacji pobierania plików. Wiąże się to z ustawianiem FireFoxa na temat: parametrów konfiguracyjnych, aby wyłączyć okno dialogowe pobierania w FireFox dla określonych typów plików. Działa to dobrze, ale teraz próbuję ustalić, jak najlepiej określić, kiedy pobieranie pliku zostało zakończone (niektóre trwają kilka sekund, a niektóre zajmują kilka minut), więc mogę wylogować się z witryny i przejść do następnego testu. Wygląda na to, że w przeglądarce nie ma już żadnych wizualnych wskazówek, może będę musiał monitorować plik w katalogu pobierania. Wszelkie opcje będą mile widziane.Watir-Webdriver Zaczekaj, aż pobieranie zakończy się
Odpowiedz
Być może możesz śledzić rozmiar pliku, aby zobaczyć, kiedy przestanie się zmieniać na kilka sekund.
Mam nieco inne podejście do automatyzacji pobierania plików. robię to tak:
W requiures:
require 'rubygems'
require 'watir-webdriver'
require 'win32ole'
najpierw utworzyć metodę obchodzenia Wielkość pliku:
def fileinfo(name)
if File.exists?(name)
print "#{name} exists "
bytes = File.size(name)
print "and is #{bytes} in size;"
whenm = File.mtime(name)
print whenm,";"
print whenm.to_i,";"
else
print "#{name} does NOT exist;"
end
end
drugie jazdy chrom z wcześniej ustalonym-up pobierania reż:
download_directory = "#{Dir.pwd}/downloads"
download_directory.gsub!("/", "\\") if Selenium::WebDriver::Platform.windows?
profile = Selenium::WebDriver::Chrome::Profile.new
profile['download.prompt_for_download'] = false
profile['download.default_directory'] = download_directory
Następnie usuń plik (z poprzednich serii) dla przypadku testowego ponownego użycia i validness (jeden z 3):
%x(DEL /Q C:\\automation\\qa\\downloads\\*.exe)
%x(DEL /Q downloads\\*.exe)
%x(DEL /Q downloads\\*.*)
Zdefiniuj zmienną wielkość pobranego składnika:
contains = Dir.new(download_directory).entries
dlc = contains[2]
dcinfo = fileinfo("downloads/"+dlc)
dlcsize = File.size("downloads/"+dlc)
I wreszcie można uwzględnić punkt Walidacja:
if dlcsize > 0
puts "File found and is #{dlcsize} bytes."
logfile = open("test_results.csv", "a")
begin
logRow = "#{__FILE__}"
logfile.puts logRow + "," + "Passed".to_s
end
else
puts "Test Failed! File not found either is zero."
logfile = open("test_results.csv", "a")
begin
logRow = "#{__FILE__}"
logfile.puts logRow + "," + "Passed".to_s
end
end
Nie podobało mi się tylko patrzenie na rozmiar pliku, czułem się kruchy, więc w końcu użyłem polecenia lsof, aby wykryć, kiedy nie ma procesów, które trzymają plik otwarty, a potem czytałem plik. Lepiej jest, aby przerwa w pobieraniu z powodu czkawki sieci nie powodowała sporadycznych błędów, ale gorzej (?), Ponieważ nie jest przenośna i uruchamia polecenie lsof.
Zakodowany wyglądał mniej więcej tak:
# Watch the download dir for new files, and read the first new file that
# appears.
def read_newest_download
existing_files = list_files_in_download_dir
new_files = []
Timeout::timeout(DOWNLOAD_TIMEOUT) do
while (new_files = list_files_in_download_dir - existing_files).empty?
sleep 0.25
end
end
if 1 == new_files.size
wait_for_file_to_be_closed(new_files.first)
File.read(new_files.first)
else
fail "Found #{new_files.size} new files."
end
end
# Ignore files ending in .part, which is common for temp files in Firefox.
def list_files_in_download_dir
raise ArgumentError, "No download dir specified" unless @opts[:download_dir]
@_download_glob ||= File.join(@opts[:download_dir], "*")
# Ignore files ending in .part as they're temporary files from Firefox.
Dir[@_download_glob].entries.reject {|e| /\.part$/ === e}
end
def wait_for_file_to_be_closed(filename)
begin
sleep 0.25
end until `lsof #{filename}`.blank?
end
Chrome zapisuje niedokończone pliki do pobrania z dodatkiem .crdownload
rozszerzenia pliku. Sprawdź, czy katalog ma pobieranie pliku o rozszerzeniu .crdownload
i że powinien powiedzieć, czy nadal trwa pobieranie
Sposób, w jaki sobie z tym poradzić, jest następujący
Firefox ściągnąć pliki kończą .part
po pobraniu wszystkie nazwy plików są pobierane na listę ".część”do nich przechowywać na pętli na tej liście i sprawdzić, czy któryś z tych plików, nadal istnieje w lsdir folderu pobierania kodu
Python:
import os
import time
def wait_till_download():
if len(new_part_files) > 0:
time.sleep(1)
for part_file in new_part_files:
if part_file in os.listdir("."):
print "Downloading..."
wait_till_download()
Uwaga: Gdy nie ma żadnych plików part . w os.listdir('.')
, co oznacza, że pobieranie jest zakończone
miałem podobne zadanie, gdzie chciałem, aby wyodrębnić zawartość pobranego pliku PDF Kiedyś następujące rozwiązanie:
t = ''
(0..19).each do
sleep 5
t = `pdftotext -raw some_directory/*.pdf -`
break if $?.success?
end
Wykonuje 20 prób wydobycia tekstu za pomocą polecenia pdftotext powłoki i wyłamie się z bloku, jeśli polecenie powłoki zakończyło się pomyślnie. Zaletą robienia tego w ten sposób jest to, że jeśli plik nie istnieje lub plik jest tylko częściowo pobrany, wygeneruje błąd, a następnie spróbuje ponownie. Jeśli twój plik nie jest plikiem PDF lub nie dbasz o jego zawartość, użyjesz innego polecenia powłoki zamiast pdftotextu, o ile spowoduje to błąd, jeśli plik jest niekompletny.
- 1. Poczekaj, aż kolejkaUserWorkItem zakończy się
- 2. Poczekaj, aż zakończy się Application.Calculate
- 3. UIScrollView zatrzymuje NSTimer, aż przewijanie się zakończy
- 4. XCTestCase: Zaczekaj, aż aplikacja przestanie działać.
- 5. Android Espresso: Poczekaj, aż aktywność się zakończy/uruchom
- 6. Czy sekwencja SKAction rzeczywiście czeka, aż akcja się zakończy?
- 7. VBScript - Jak sprawić, aby program czekał, aż proces się zakończy?
- 8. Jak wykonać blokadę, która czeka aż animacja się zakończy?
- 9. Jak mogę rozpocząć nowy proces i czekać, aż się zakończy?
- 10. Jak poczekać, aż zakończy się tylko pierwszy wątek w Pythonie
- 11. Poczekaj, aż uruchomi się tomcat
- 12. wkhtmltopdf zaczekaj na stan przed wydrukowaniem
- 13. BatchUpdateException: partia nie zakończy się
- 14. Obietnice: Powtarzaj operację, aż się to uda?
- 15. Czy istnieje sposób zmuszenia PHP do czekania, aż MySQL zakończy się transakcją?
- 16. Odłóż całe ładowanie strony w AngularJS, aż ajax usługi zakończy się
- 17. Jeśli polecenie getaddrinfo zakończy się niepowodzeniem, gdy zakończy się niepowodzeniem na zawsze (nawet po uruchomieniu sieci)
- 18. Jak sprawdzić, kiedy zakończy się Shell32.Folder.CopyHere()
- 19. Proces w Pythonie nie zakończy się
- 20. Co się stanie, jeśli konstruktor shared_ptr zakończy się niepowodzeniem?
- 21. JUnit test zaczyna się, zanim zakończy się RUNSCRIPT H2S
- 22. jak sprawić, aby plik wsadowy czekał, aż inny plik wsadowy zakończy wykonywanie?
- 23. Jak poczekać, aż składnik React zakończy całkowicie aktualizację w Jest i/lub Enzyme?
- 24. Jak mogę poczekać, aż użytkownik zakończy zapisywanie w tekście, aby wywołać funkcję?
- 25. AutoIT Poczekaj, aż element kontrolny pojawi się
- 26. MonoTouchDesignServerUnified nieoczekiwanie zakończy pracę
- 27. Jak wskazać, że test PHPUnit zakończy się niepowodzeniem?
- 28. Groovy: jak sprawdzić, czy dostęp do nieruchomości zakończy się sukcesem?
- 29. Wyświetlaj okno dialogowe, gdy sprawdzanie poprawności wejścia zakończy się niepowodzeniem.
- 30. Android jobScheduler nie zakończy się z jobFinished (params, false)
To prawie jedyne rozwiązanie, które znalazłem. To niezbyt satysfakcjonujące, ponieważ muszę śledzić plik, biorąc pod uwagę, jak Firefox obsługuje pobieranie. Działa, ale nie jest przenośny podczas sterowania inną przeglądarką. – user1142012
Możesz także napotkać problemy, gdy masz mniej stabilne połączenie sieciowe. – encoded