2012-01-11 24 views
9

Firefox ile Watir-Webdriver'ı ve watirwebdriver.com sitesinden dosya indirme işlemlerini otomatikleştirmek için önerilen yöntemi kullanıyorum. Bu, FireFox'u şu şekilde ayarlamayı içerir: belirli dosya türleri için FireFox'taki indirme iletişimini devre dışı bırakmak için config parametreleri. Bu iyi çalışıyor, ancak şimdi, dosya indirme işleminin ne zaman tamamlandığını belirlemenin en iyi yolunu bulmaya çalışıyorum (bazıları bir kaç saniye sürüyor, bazıları bir kaç dakika alıyor), böylece siteden çıkış yapabilirim ve bir sonraki teste geçebilirim. Tarayıcıda herhangi bir görsel ipucu kalmamış olduğundan, dosyayı indirme dizininde izlemek zorunda kalabilirim. Herhangi bir seçenek takdir edilecektir.Watir-Webdriver Yükleme için Tamamlandı

cevap

2

Belki de birkaç saniye değişen durduğunda görmek için dosya boyutunu izleyebilirsiniz.

+0

Bu, bulduğum tek çözüm. Bu çok tatmin edici değil çünkü Firefox'un bir indirme işlemini nasıl yürüttüğüne dair dosyayı izlemem gerekiyor. Farklı bir tarayıcıyı kontrol ederken çalışır ancak taşınabilir değildir. – user1142012

+0

Daha az kararlı bir ağ bağlantınız olduğunda da sorunlarla karşılaşabilirsiniz. – encoded

1

Dosya indirme otomasyonu için biraz farklı bir yaklaşımım var. Ben böyle yapmak :

requiures:

require 'rubygems' 
require 'watir-webdriver' 
require 'win32ole' 

İlk Filesize kullanım için bir yöntem oluşturun:

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 

İkincisi önceden kurulum indir dir ile krom sürücü:

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 

Sonraki dosyayı (önceki çalışmalardan) sınama durumu için silin yeniden kullanılabilirlik ve validness (3 tane):

%x(DEL /Q C:\\automation\\qa\\downloads\\*.exe) 
%x(DEL /Q downloads\\*.exe) 
%x(DEL /Q downloads\\*.*) 

indirilen bileşenin boyutu değişkeni tanımlayın:

contains = Dir.new(download_directory).entries 
dlc = contains[2] 
dcinfo = fileinfo("downloads/"+dlc) 
dlcsize = File.size("downloads/"+dlc) 

Ve son olarak doğrulama noktasını içerebilir:

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 
2

Sadece dosyalara bakmayı sevmedim, kırılgan hissettim, bu yüzden dosyayı açık tutan hiçbir işlemin bulunmadığını ve daha sonra dosyayı okuduğunu algılamak için lsof komutunu kullanıyorum. Ağdaki hıçkırıklardan dolayı indirme işlemindeki bir duraklamanın aralıklı hatalara neden olmayacağı, ancak daha da kötüsünün (?) Portatif olmadığından ve lsof komutunun dışına çıkarılmasından daha iyidir. Ek bir .crdownload dosya uzantısı ile

# 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 
2

Krom saklar tamamlanmamış indirme:

kodlu

böyle bir şey görünüyordu. İndirme dizinini .crdownload ile biten bir dosya vardır ve indirme hala

0

ben bu işlemek yolu sürmekte olup olmadığını söyleyecektir gerekip gerekmediğini görmek için kontrol edin Aşağıdaki

Firefox dosyaları .part

ile sona indirmek olduğunu

, tüm dosyaların eklendikten sonra bir listede indirilen adlarına sahip olur.Onlara parçası" o listede döngü devam ve bu dosyaların herhangi hala indirme klasörüne

Python kodu lsdir mevcut olmadığını kontrol :

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() 

not: hiçbir bölümü dosyalar olduğunda .

: os.listdir('.') yılında, o indirme Ben indirilen PDF dosyasının içeriğini ayıklamak için istedim benzer bir görevi vardı
1

bitmiş demektir aşağıdaki çözümü için kullanılan

Kabuk komutu pdftotext komutunu kullanarak metni ayıklama 20 denemesi yapar ve kabuk komutunun başarılı olması durumunda bloğun dışına çıkacaktır. Bu şekilde yapmanın avantajı, eğer dosya mevcut değilse veya dosya sadece kısmen indirilmişse, bir hata üretecek ve sonra tekrar deneyecektir. Dosyanız bir PDF değilse veya içeriği umursamıyorsanız, dosya eksikse bir hata üretmesi koşuluyla pdftotext yerine başka bir kabuk komutu kullanırsınız.

İlgili konular