Можно ли сделать снимок экрана со всей страницы с помощью Selenium/Capybara?

PhantomJS имеет возможность снимать скриншот всей страницы (а не только текущего окна просмотра). Есть ли способ сделать это с помощью Selenium? Я запускаю тесты Огурца/Капибары без головы, используя безголовую жемчужину. Я бы использовал PhantomJS, но у меня были другие проблемы.

Ответ 1

Оказывается, я использую метод take_screenshot, который был предоставлен безголовым самоцветом, когда я мог бы просто использовать метод page.save_screenshot(), который делает именно то, что мне нужно. Спасибо, Андрей.

Ответ 2

В случае, если кто-нибудь вымыл этот берег в поисках того, как это сделать с Poltergeist, вам просто нужно передать full аргумент:

page.save_screenshot('screen.png', full: true) # If providing a custom file name.
page.save_screenshot(full: true)               # Capybara sets a name based on timestamp.
page.save_and_open_screenshot('screen.png', full: true) # Same as save_screenshot.
page.save_and_open_screenshot(full: true)               # Same as save_screenshot.

Документы

Надеюсь, поможет!

Ответ 3

Вы также можете сделать что-то вроде этого:

After do |scenario|
  take_screenshot(@browser, scenario)
end

def take_screenshot(browser, scenario)
  if scenario.failed?
    scenario_name = scenario.name.gsub /[^\w\-]/, ' '
    time = Time.now.strftime("%Y-%m-%d %H%M")
    screenshot_path = './failed_png/' + time + ' - ' + scenario_name + '.png'
  else
    scenario_name = scenario.name.gsub /[^\w\-]/, ' '
    time = Time.now.strftime("%Y-%m-%d %H%M")
    screenshot_path = './success_png/' + time + ' - ' + scenario_name + '.png'
  end
  browser.save_screenshot(screenshot_path)
end

Если вы создадите папку failed_png и success_png, этот код сделает снимок экрана для каждого успеха и неудачи и поместит его в соответствующие папки с меткой времени. Этот код входит в ваш файл env.rb и делает его таким, что вам не нужно использовать какие-либо помощники или добавлять дополнительный код в ваш пароль.

Ответ 4

Я много чего перепробовал, работая с Capybara/Selenium на полную высоту.

Казалось, сработала только одна вещь, и она использовала headless_chrome. Помните, что я использую цикл, чтобы делать скриншоты различной ширины:

  def screenshot
    driver = Capybara.current_session.driver
    window = Capybara.current_session.driver.browser.manage.window
    widths = [320, 1380] #leave normal w as last
    widths.each do |w|
      window.resize_to(w, 900)
      total_width = driver.execute_script("return document.body.offsetWidth")
      total_height = driver.execute_script("return document.body.scrollHeight")
      window.resize_to(total_width, total_height)
      save_screenshot
    end
  end

Я изменяю размер дважды, чтобы получить информацию о высоте.

rails_helper.rb:

Capybara.register_driver :headless_chrome do |app|
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    chromeOptions: { 
      "args" => %w{ 
        headless 
        disable-gpu
        --disable-notifications
      } 
    }
  )
  Capybara::Selenium::Driver.new app,
    browser: :chrome,
    desired_capabilities: capabilities
end

Capybara.javascript_driver     = :headless_chrome
Capybara.current_driver        = :headless_chrome