2011-07-26 89 views
2

我有一個黃瓜套件設置爲讀取靜態PDF文件並對其內容進行斷言。黃瓜閱讀PDF到臨時文件

我最近更新了我所有的寶石,因爲這樣做,它不再工作。

黃瓜步驟如下:

When /^I follow PDF link "([^"]*)"$/ do |arg1| 
    temp_pdf = Tempfile.new('foo') 
    temp_pdf << page.body 
    temp_pdf.close 
    temp_txt = Tempfile.new('txt') 
    temp_txt.close 
    'pdftotext -q #{temp_pdf.path} #{temp_txt.path}' 
    page.drive.instance_variable_set('@body', File.read(temp_txt.path)) 
end 

過去,這工作得很好。但更新到獅子/我的寶石後,執行線的時候temp_pdf << page.body

encoding error: output conversion failed due to conv error, bytes 0xA3 0xC3 0x8F 0xC3 
I/O error : encoder error 

我試圖從不同的來源幾個不同的PDF文件,他們似乎都未能引發以下錯誤。我怎樣才能將PDF讀入臨時文件?

+0

我想這一定是在水豚,黃瓜,紅寶石1.8.7或三者的某種組合的錯誤。我明確地將我的黃瓜,黃瓜欄,水豚和小黃瓜寶石回滾到gemfile中的早期版本,現在我的測試再次運行。 – DVG

回答

4

下面這段代碼適用於我。必須改變temp_pdf < < page.body,page.source(正文已解析錯誤)。我還必須在驅動程序瀏覽器上設置實例變量@dom,而不是驅動程序上的@body。這是因爲在最近的水豚版本(rack_test)驅動程序沒有實例變量體存在,而不是身體的呼叫「@ browser.body」:再次

https://github.com/jnicklas/capybara/blob/master/lib/capybara/rack_test/driver.rb

browser.body,調用「dom.to_xml」,和如果你看看'dom',你會發現它使用Nokogiri :: HTML初始化@dom,因此它首先使nokogiri轉換錯誤變得很有意義。

https://github.com/jnicklas/capybara/blob/master/lib/capybara/rack_test/browser.rb

with_scope(selector) do 
    click_link(label) 
    temp_pdf = Tempfile.new('pdf') 
    temp_pdf << page.source 
    temp_pdf.close 
    temp_txt = Tempfile.new('txt') 
    temp_txt.close 
    temp_txt_path = "#{temp_txt.path}.html" 
    `pdftohtml -c -noframes #{temp_pdf.path} #{temp_txt_path}` 
    page.driver.browser.instance_variable_set('@dom', Nokogiri::HTML(File.read(temp_txt_path)) 
end 
+0

將#body更改爲#source非常有用 - 謝謝 –