2012-06-15 3 views
2

웹 사이트에서 파일을 다운로드하여 폴더에 추가하는 테스트 시나리오를 진행하고 있습니다. 다운로드 부분에 대해서는 Watir 설명서의 browser-downloads 페이지에 설명 된 코드를 사용하고 있습니다. 필자가 다운로드 할 파일을 기다리고 때 가장 큰 문제는 내 시험에서 발생했습니다 :Ruby/Watir-Webdriver - 다운로드 후 파일에 액세스 할 수 없습니다.

def verify_csv_file_exists 
    path = Dir.getwd + "/downloads/" 
    until File.exist?("#{path}*.csv") == true 
     sleep 1 
    end 
    end 

테스트를 실행하는 경우,이 디렉토리에있는 파일을 볼 수 없습니다 때문에 결코 위의 절차 중지는 있지만, 파일이 다운로드됩니다.

이 상황을 어떻게 처리 할 수 ​​있는지 알고있는 사람이 있습니까?

감사합니다.

답변

5

을 확인한 다음을 다운로드 한 다음 디렉토리에 새 파일이 추가 될 때까지 기다리십시오 (현재 내용과 이전 내용을 비교). 이 작업을 수행해야합니다

:

require 'watir-webdriver' 

file_name = nil 
download_directory = "#{Dir.pwd}/downloads" 
download_directory.gsub!("/", "\\") if Selenium::WebDriver::Platform.windows? 
downloads_before = Dir.entries download_directory 

profile = Selenium::WebDriver::Firefox::Profile.new 
profile['browser.download.folderList'] = 2 # custom location 
profile['browser.download.dir'] = download_directory 
profile['browser.helperApps.neverAsk.saveToDisk'] = "text/csv,application/pdf" 

b = Watir::Browser.new :firefox, :profile => profile 

b.goto 'https://dl.dropbox.com/u/18859962/hello.csv' 

30.times do 
    difference = Dir.entries(download_directory) - downloads_before 
    if difference.size == 1 
    file_name = difference.first 
    break 
    end 
    sleep 1 
end 
raise "Could not locate a new file in the directory '#{download_directory}' within 30 seconds" if not file_name 
puts file_name 
+0

Alister 고맙습니다. 당신의 솔루션은 그 일을합니다 :) –

0

File.exists?과 같이 "glob"를 File.exists?("*.csv")과 같이 사용할 수 없습니다. *.csv이라는 파일이 있는지 여부를 확인하고 이름이 .csv으로 끝나는 파일이 있는지 여부를 확인합니다. 정확한 파일 이름을 사용하여 파일이 존재하는지 확인해야합니다.

+0

이 문제는 다운로드 링크를 눌러 때 생성되는 파일의 이름이 고유 번호가 포함되어 있다는 것입니다 이것은 새로운 파일명을 얻을 방법이다. 이제이 번호를 얻을 수있는 방법이 있습니다. | 그래서이 방법을 사용하여 파일이 폴더에 있는지 확인합니다. –

+1

내 말은, 파일이 없으면 무한 루프가 도움이되지 않는다는 것입니다. – pguardiario

+0

파일이 존재하고 다운로드되며 테스트 실행 중에는 루비가 볼 수 없습니다. 디렉토리에서 모든 파일을 표시하는 코드를 실행하더라도 (다운로드가 완료된 후) 아무 것도 반환하지 않습니다.> path = Dir.getwd + "/ downloads /" Dir.glob ("# {path} *. csv "). 각 {| f | puts f} –

0

이 대신처럼보십시오 :

Dir.glob('downloads/*.csv').any? 

을 또한 어떻게 1 자고 둘째 아무것도 변경하기로? 멀티 스레드 응용 프로그램입니까?

+0

나는 이것을 시도했지만 작동하지 않는다. 나는 거의 모든 방법을 시도했다. 테스트 실행 중에 다운로드 한 파일에 액세스 할 수없는 것 같습니다. –

+0

또는 더 정확하게는 테스트 중에 다운로드 한 파일이 표시되지 않습니다. –

관련 문제