{"id":13878744,"url":"https://github.com/YusukeIwaki/puppeteer-ruby","last_synced_at":"2025-07-16T14:32:49.226Z","repository":{"id":37960919,"uuid":"226063326","full_name":"YusukeIwaki/puppeteer-ruby","owner":"YusukeIwaki","description":"A Ruby port of Puppeteer","archived":false,"fork":false,"pushed_at":"2024-09-14T00:21:56.000Z","size":2529,"stargazers_count":289,"open_issues_count":10,"forks_count":42,"subscribers_count":10,"default_branch":"main","last_synced_at":"2024-10-29T15:48:30.285Z","etag":null,"topics":["puppeteer","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/YusukeIwaki.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"YusukeIwaki"}},"created_at":"2019-12-05T09:21:47.000Z","updated_at":"2024-10-10T14:14:01.000Z","dependencies_parsed_at":"2022-07-16T10:30:35.284Z","dependency_job_id":"bf68f764-a3d2-4756-9c77-6d893fe4d451","html_url":"https://github.com/YusukeIwaki/puppeteer-ruby","commit_stats":{"total_commits":688,"total_committers":15,"mean_commits":45.86666666666667,"dds":"0.22383720930232553","last_synced_commit":"558524d4b69e26c61e10bd1e38d08c95791ecaf9"},"previous_names":[],"tags_count":82,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeIwaki%2Fpuppeteer-ruby","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeIwaki%2Fpuppeteer-ruby/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeIwaki%2Fpuppeteer-ruby/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YusukeIwaki%2Fpuppeteer-ruby/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/YusukeIwaki","download_url":"https://codeload.github.com/YusukeIwaki/puppeteer-ruby/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226138849,"owners_count":17579496,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["puppeteer","ruby"],"created_at":"2024-08-06T08:01:58.544Z","updated_at":"2024-11-24T07:31:17.546Z","avatar_url":"https://github.com/YusukeIwaki.png","language":"Ruby","funding_links":["https://github.com/sponsors/YusukeIwaki"],"categories":["Ruby"],"sub_categories":[],"readme":"[![Gem Version](https://badge.fury.io/rb/puppeteer-ruby.svg)](https://badge.fury.io/rb/puppeteer-ruby)\n\n# Puppeteer in Ruby\n\nA Ruby port of [puppeteer](https://pptr.dev/).\n\n![logo](puppeteer-ruby.png)\n\nREMARK: This Gem covers just a part of Puppeteer APIs. See [API Coverage list](./docs/api_coverage.md) for detail. Feedbacks and feature requests are welcome :)\n\n## Getting Started\n\n### Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'puppeteer-ruby'\n```\n\nAnd then execute:\n\n    $ bundle install\n\n### Capture a site\n\n```ruby\nrequire 'puppeteer-ruby'\n\nPuppeteer.launch(headless: false) do |browser|\n  page = browser.new_page\n  page.goto(\"https://github.com/YusukeIwaki\")\n  page.screenshot(path: \"YusukeIwaki.png\")\nend\n```\n\nNOTE: `require 'puppeteer-ruby'` is not necessary in Rails.\n\n### Simple scraping\n\n```ruby\nrequire 'puppeteer-ruby'\n\nPuppeteer.launch(headless: false, slow_mo: 50, args: ['--window-size=1280,800']) do |browser|\n  page = browser.new_page\n  page.viewport = Puppeteer::Viewport.new(width: 1280, height: 800)\n  with_network_retry { page.goto(\"https://github.com/\", wait_until: 'domcontentloaded') }\n\n  page.wait_for_selector('[placeholder=\"Search or jump to...\"]').click\n  search_input = page.wait_for_selector('input[name=\"query-builder-test\"]')\n  search_input.click\n  page.keyboard.type_text(\"puppeteer\")\n\n  page.wait_for_navigation do\n    search_input.press(\"Enter\")\n  end\n\n  list = page.wait_for_selector('[data-testid=\"results-list\"]')\n  items = list.query_selector_all(\".search-title\")\n  items.each do |item|\n    title = item.eval_on_selector(\"a\", \"a =\u003e a.innerText\")\n    puts(\"==\u003e #{title}\")\n  end\nend\n```\n\n### Evaluate JavaScript\n\n```ruby\nrequire 'puppeteer-ruby'\n\nPuppeteer.launch do |browser|\n  page = browser.new_page\n  page.goto 'https://github.com/YusukeIwaki'\n\n  # Get the \"viewport\" of the page, as reported by the page.\n  dimensions = page.evaluate(\u003c\u003c~JAVASCRIPT)\n  () =\u003e {\n    return {\n      width: document.documentElement.clientWidth,\n      height: document.documentElement.clientHeight,\n      deviceScaleFactor: window.devicePixelRatio\n    };\n  }\n  JAVASCRIPT\n\n  puts \"dimensions: #{dimensions}\"\n  # =\u003e dimensions: {\"width\"=\u003e800, \"height\"=\u003e600, \"deviceScaleFactor\"=\u003e1}\nend\n```\n\nMore usage examples can be found [here](https://github.com/YusukeIwaki/puppeteer-ruby-example)\n\n## :whale: Running in Docker\n\nFollowing packages are required.\n\n- Google Chrome or Chromium\n  - In Debian-based images, `google-chrome-stable`\n  - In Alpine-based images, `chromium`\n\nAlso, CJK font will be required for Chinese, Japanese, Korean sites.\n\n### References\n\n- Puppeteer official README: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-puppeteer-in-docker\n- puppeteer-ruby example: https://github.com/YusukeIwaki/puppeteer-ruby-example/tree/master/docker_chromium\n\n## :bulb: Collaboration with Selenium or Capybara\n\nIt is really remarkable that we can use puppeteer functions in existing Selenium or Capybara codes, with a few configuration in advance.\n\n```ruby\nrequire 'spec_helper'\n\nRSpec.describe 'hotel.testplanisphere.dev', type: :feature do\n  before {\n    visit 'https://hotel.testplanisphere.dev/'\n\n    # acquire Puppeteer::Browser instance, by connecting Chrome with DevTools Protocol.\n    @browser = Puppeteer.connect(\n                 browser_url: 'http://localhost:9222',\n                 default_viewport: Puppeteer::Viewport.new(width: 1280, height: 800))\n  }\n\n  after {\n    # release Puppeteer::Browser reesource.\n    @browser.disconnect\n  }\n\n  it 'can be handled with puppeteer and assert with Capybara' do\n    # automation with puppeteer\n    puppeteer_page = @browser.pages.first\n    puppeteer_page.wait_for_selector('li.nav-item')\n\n    reservation_link = puppeteer_page.query_selector_all('li.nav-item')[1]\n\n    puppeteer_page.wait_for_navigation do\n      reservation_link.click\n    end\n\n    # expectation with Capybara DSL\n    expect(page).to have_text('宿泊プラン一覧')\n  end\n\n  it 'can be handled with Capybara and assert with puppeteer' do\n    # automation with Capybara\n    page.all('li.nav-item')[1].click\n\n    # expectation with puppeteer\n    puppeteer_page = @browser.pages.first\n    body_text = puppeteer_page.eval_on_selector('body', '(el) =\u003e el.textContent')\n    expect(body_text).to include('宿泊プラン一覧')\n  end\n```\n\nThe detailed step of configuration can be found [here](https://github.com/YusukeIwaki/puppeteer-ruby-example/tree/master/_with_capybara-rspec).\n\n## :bulb: Use Puppeteer methods simply without Capybara::DSL\n\nWe can also use puppeteer-ruby as it is without Capybara DSL. When you want to just test a Rails application simply with Puppeteer, refer this section.\n\nAlso, if you have trouble with handling flaky/unstable testcases in existing feature/system specs, consider replacing Capybara::DSL with raw puppeteer-ruby codes like `page.wait_for_selector(...)` or `page.wait_for_navigation { ... }`.\n\nCapybara prepares test server even when Capybara DSL is not used.\n\nSample configuration is shown below. You can use it by putting the file at `spec/support/puppeteer_ruby.rb` or another location where RSpec loads on initialization.\n\n```ruby\nRSpec.configure do |config|\n  require 'capybara'\n\n  # This driver only requests Capybara to launch test server.\n  # Remark that no Capybara::DSL is available with this driver.\n  class CapybaraNullDriver \u003c Capybara::Driver::Base\n    def needs_server?\n      true\n    end\n  end\n\n  Capybara.register_driver(:null) { CapybaraNullDriver.new }\n\n  config.around(driver: :null) do |example|\n    Capybara.current_driver = :null\n\n    # Rails server is launched here,\n    # (at the first time of accessing Capybara.current_session.server)\n    @base_url = Capybara.current_session.server.base_url\n\n    require 'puppeteer'\n    launch_options = {\n      # Use launch options as you like.\n      channel: :chrome,\n      headless: false,\n    }\n    Puppeteer.launch(**launch_options) do |browser|\n      @puppeteer_page = browser.new_page\n      example.run\n    end\n\n    Capybara.reset_sessions!\n    Capybara.use_default_driver\n  end\nend\n```\n\nNow, we can work with integration test using `Puppeteer::Page` in puppeteer-ruby.\n\n```ruby\nRSpec.describe 'Sample integration tests', driver: :null do\n  let(:page) { @puppeteer_page }\n  let(:base_url) { @base_url }\n\n  it 'should work with Puppeteer' do\n    # null driver only launches server, and Capybara::DSL is unavailable.\n    expect { visit '/' }.to raise_error(/NotImplementedError/)\n\n    page.goto(\"#{base_url}/\")\n\n    # Automation with Puppeteer\n    h1_text = page.eval_on_selector('h1', '(el) =\u003e el.textContent')\n    expect(h1_text).to eq('It works!')\n  end\nend\n```\n\n## API\n\nhttps://yusukeiwaki.github.io/puppeteer-ruby-docs/\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/YusukeIwaki/puppeteer-ruby.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FYusukeIwaki%2Fpuppeteer-ruby","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FYusukeIwaki%2Fpuppeteer-ruby","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FYusukeIwaki%2Fpuppeteer-ruby/lists"}