Огурец читает pdf во временный файл - PullRequest
2 голосов
/ 26 июля 2011

У меня есть набор огурцов для чтения статического 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

Раньше это работало просто отлично. Но после обновления до Lion / my gems он выдает следующую ошибку при выполнении строки 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 прочитанный во временный файл?

1 Ответ

4 голосов
/ 13 сентября 2011

Следующий фрагмент кода работает для меня.Пришлось изменить temp_pdf << page.body, на page.source (так как тело уже проанализировано неисправно).Мне также пришлось установить переменную экземпляра @dom в браузере драйверов вместо @body в драйвере.Это связано с тем, что в драйвере последних версий capybara (rack_test) нет тела переменной экземпляра, вместо этого тело вызывает '@ browser.body': </p>

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

browser.body снова, вызываетdom.to_xml ', и если вы посмотрите на' dom ', то увидите, что он инициализирует @dom с помощью Nokogiri :: HTML, поэтому имеет большой смысл, что в первую очередь были ошибки преобразования 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
...