puppeteer-ruby 0.0.25 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73958c6fad7b569150344ee3cc43d20ca6eeaf82898bd1b20d8c9f40772e66f3
4
- data.tar.gz: 3d39e319ed9e21aeff3868255ae956e16c9ef63f507a8bb591ea9693084110df
3
+ metadata.gz: f1b2bb89d30c93e2f942e9e14b72952f7fbbdcb027c564a9477d920316032d83
4
+ data.tar.gz: 716ee3c3cc6d7a7d1086d9dc34b97c879996dfcc18e88744a9a70e8d2292b842
5
5
  SHA512:
6
- metadata.gz: e15df5c9f1114cbc599c81d541a4abcb90c6470a37ebfbeeca5c18152b4f034b55ce5af99d7f00ddc717ddf6abdf854dd7a80828deb15ec306b7c2b3e336791e
7
- data.tar.gz: 0e51a01f8e02c3bdfea8bd0c13f781a4c101d638aacf30bc7bcb21429820326ac1cd2ae186586f49116a6791d046416ef92b59e8ec5121e2bc61097155686c38
6
+ metadata.gz: 952bc67ff27947ac127c43316476a9e690f6dfc0cdfaa6dabb5030ddca782f178bb0e9c71c156c6a707979d1322a4d0f24eacf0015e2b92db77d4da31e1ecc7c
7
+ data.tar.gz: 58775749a3ef44e2e2ab27fd90fee93ae74b2fa7ecec087bdb8df4bc5ede5e4199f07dd9cff587fd968ea509b03962c43b35e7711307f7b163f59ffceb3b7a07
data/.circleci/config.yml CHANGED
@@ -1,30 +1,41 @@
1
1
  version: 2.1
2
- orbs:
3
- ruby: circleci/ruby@0.1.2
2
+
3
+ rspec_chrome_job: &rspec_chrome_job
4
+ steps:
5
+ - checkout
6
+ - run:
7
+ command: gem install bundler:2.2.3 && bundle install
8
+ - run:
9
+ name: rspec
10
+ command: |
11
+ DEBUG=1 bundle exec rspec --profile 10 \
12
+ --format RspecJunitFormatter \
13
+ --out test_results/rspec.xml \
14
+ --format documentation
4
15
 
5
16
  jobs:
6
- rspec:
17
+ rspec_chrome_ruby2_6:
7
18
  docker:
8
19
  - image: circleci/ruby:2.6.6-buster-node-browsers
9
- executor: ruby/default
10
- steps:
11
- - checkout
12
- - ruby/bundle-install
13
- - run:
14
- name: rspec
15
- command: |
16
- DEBUG=1 bundle exec rspec --profile 10 \
17
- --format RspecJunitFormatter \
18
- --out test_results/rspec.xml \
19
- --format documentation
20
+ <<: *rspec_chrome_job
21
+
22
+ rspec_chrome_ruby2_7:
23
+ docker:
24
+ - image: circleci/ruby:2.7.2-buster-node-browsers
25
+ <<: *rspec_chrome_job
26
+
27
+ rspec_chrome_ruby3_0:
28
+ docker:
29
+ - image: circleci/ruby:3.0.0-buster-node-browsers
30
+ <<: *rspec_chrome_job
20
31
 
21
32
  rspec_firefox:
22
33
  docker:
23
- - image: circleci/ruby:2.6.6-buster-node-browsers
24
- executor: ruby/default
34
+ - image: circleci/ruby:2.7.2-buster-node-browsers
25
35
  steps:
26
36
  - checkout
27
- - ruby/bundle-install
37
+ - run:
38
+ command: gem install bundler:2.2.3 && bundle install
28
39
  - run:
29
40
  name: install firefox-nightly
30
41
  command: |
@@ -43,13 +54,10 @@ jobs:
43
54
  deploy:
44
55
  docker:
45
56
  - image: circleci/ruby:2.6.3-stretch-node
46
- executor: ruby/default
47
57
  steps:
48
58
  - checkout
49
59
  - run:
50
- name: Which bundler?
51
- command: bundle -v
52
- - ruby/bundle-install
60
+ command: gem install bundler:2.2.3 && bundle install
53
61
  - run:
54
62
  name: rake build
55
63
  command: rake build
@@ -70,7 +78,9 @@ jobs:
70
78
  workflows:
71
79
  ci:
72
80
  jobs:
73
- - rspec
81
+ - rspec_chrome_ruby2_6
82
+ - rspec_chrome_ruby2_7
83
+ - rspec_chrome_ruby3_0
74
84
  - rspec_firefox
75
85
  rubygems-deploy:
76
86
  jobs:
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ ### Step To Reproduce / Observed behavior
11
+
12
+
13
+ ### Expected behavior
14
+
15
+ ### Environment
16
+
17
+ Paste the output of `ruby --version`
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: Feature request
3
+ about: Request a new feature for playwright-ruby-client
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ ### Simple description about the feature
11
+
12
+
13
+ ### Usecase / Motivation
14
+
15
+ <!-- Describe why the feature helps. -->
@@ -16,12 +16,12 @@ jobs:
16
16
  - name: Set up Ruby
17
17
  uses: ruby/setup-ruby@v1
18
18
  with:
19
- ruby-version: 2.6
19
+ ruby-version: 2.7
20
20
 
21
21
  - name: Install dependencies
22
22
  run: |
23
23
  gem uninstall bundler
24
- gem install bundler -v 1.17
24
+ gem install bundler -v 2.2.3
25
25
  bundle install
26
26
 
27
27
  - name: Deploy Configuration
@@ -12,4 +12,4 @@ jobs:
12
12
  with:
13
13
  github_token: ${{ secrets.github_token }}
14
14
  reporter: github-pr-review
15
- rubocop_version: 0.90.0
15
+ rubocop_version: 1.10.0
data/CHANGELOG.md ADDED
@@ -0,0 +1,93 @@
1
+ ### master [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.30.0...master)]
2
+
3
+ * xxx
4
+
5
+ ### 0.30.0 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.29.0...0.30.0)]
6
+
7
+ New features:
8
+
9
+ * S, SS, Seval, SSeval is renamed to query_selector, query_selector_all, eval_on_selector, eval_on_selector_all
10
+
11
+ ### 0.29.0 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.28.1...0.29.0)]
12
+
13
+ New features:
14
+
15
+ * Add `AriaQueryHandler`. Now we can use "aria/...." for selectors.
16
+
17
+ ### 0.28.1 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.27...0.28.1)]
18
+
19
+ New features:
20
+
21
+ * Add `Page#emulate_idle_state`
22
+ * Change versioning rule.
23
+
24
+ ### 0.0.27 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.26...0.0.27)]
25
+
26
+ New features:
27
+
28
+ * Now puppeteer-ruby is Ruby 3.0 compatible!
29
+
30
+ ### 0.0.26 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.25...0.0.26)]
31
+
32
+ Bugfix:
33
+
34
+ * Fix `Page#screenshot` working correctly with `quality` parameter.
35
+
36
+ ### 0.0.25 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.23...0.0.25)]
37
+
38
+ New feature:
39
+
40
+ * **Cookie** feature: `Page#set_cookie`, `Page#cookies`
41
+
42
+ ### 0.0.23 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.22...0.0.23)]
43
+
44
+ New feature:
45
+
46
+ * **GeoLocation** feature
47
+ * grant/clear permission
48
+
49
+ Bugfix/Improvement:
50
+
51
+ * Refactoring for events ([#31](https://github.com/YusukeIwaki/puppeteer-ruby/pull/31))
52
+ * Improve SEND/RECV handling in CDPSession ([#34](https://github.com/YusukeIwaki/puppeteer-ruby/pull/34))
53
+
54
+ ### 0.0.22 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.21...0.0.22)]
55
+
56
+ Bugfix
57
+
58
+ * Make `Puppeteer#default_args` to work
59
+ * Respect Firefox launch options
60
+ * Respect `default_viewport: nil`
61
+
62
+ ### 0.0.21 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.20...0.0.21)]
63
+
64
+ Bugfix/Improvement:
65
+
66
+ * Update DeviceDescriptors (list of emulatable devices)
67
+ * Fix bug on inputing "(" ([#25](https://github.com/YusukeIwaki/puppeteer-ruby/pull/25))
68
+
69
+ ### 0.0.20 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.19...0.0.20)]
70
+
71
+ New feature
72
+
73
+ * Dialog-handling feature
74
+
75
+ ### 0.0.19 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.18...0.0.19)]
76
+
77
+ New feature
78
+
79
+ * **Firefox support**
80
+
81
+ Bugfix/Improvement
82
+
83
+ * Allow `Page#keyboard` with block ([#18](https://github.com/YusukeIwaki/puppeteer-ruby/pull/18))
84
+
85
+ ### 0.0.18 [[diff](https://github.com/YusukeIwaki/puppeteer-ruby/compare/0.0.17...0.0.18)]
86
+
87
+ New feature
88
+
89
+ * **Firefox support**
90
+
91
+ Bugfix/Improvement
92
+
93
+ * Allow `Page#keyboard` with block ([#18](https://github.com/YusukeIwaki/puppeteer-ruby/pull/18))
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM circleci/ruby:2.6.6-buster-node-browsers
1
+ FROM circleci/ruby:3.0.0-rc1-buster-node-browsers
2
2
 
3
3
  USER root
4
4
 
data/README.md CHANGED
@@ -1,15 +1,31 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/puppeteer-ruby.svg)](https://badge.fury.io/rb/puppeteer-ruby)
2
2
 
3
- # Puppeteer in Ruby [UNDER HEAVY DEVELOPMENT]
3
+ # Puppeteer in Ruby
4
4
 
5
5
  A Ruby port of [puppeteer](https://pptr.dev/).
6
6
 
7
7
  ![logo](puppeteer-ruby.png)
8
8
 
9
- REMARK: This Gem is NOT production-ready!!
9
+ REMARK: This Gem covers just a part of Puppeteer APIs. Feedbacks and feature requests are welcome :)
10
10
 
11
11
  ## Getting Started
12
12
 
13
+ ### Installation
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ ```ruby
18
+ gem 'puppeteer-ruby'
19
+ ```
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install puppeteer-ruby
28
+
13
29
  ### Capture a site
14
30
 
15
31
  ```ruby
@@ -30,18 +46,18 @@ Puppeteer.launch(headless: false, slow_mo: 50, args: ['--guest', '--window-size=
30
46
  page.viewport = Puppeteer::Viewport.new(width: 1280, height: 800)
31
47
  page.goto("https://github.com/", wait_until: 'domcontentloaded')
32
48
 
33
- form = page.S("form.js-site-search-form")
34
- searchInput = form.S("input.header-search-input")
49
+ form = page.query_selector("form.js-site-search-form")
50
+ searchInput = form.query_selector("input.header-search-input")
35
51
  searchInput.type_text("puppeteer")
36
52
  await_all(
37
53
  page.async_wait_for_navigation,
38
54
  searchInput.async_press("Enter"),
39
55
  )
40
56
 
41
- list = page.S("ul.repo-list")
42
- items = list.SS("div.f4")
57
+ list = page.query_selector("ul.repo-list")
58
+ items = list.query_selector_all("div.f4")
43
59
  items.each do |item|
44
- title = item.Seval("a", "a => a.innerText")
60
+ title = item.eval_on_selector("a", "a => a.innerText")
45
61
  puts("==> #{title}")
46
62
  end
47
63
  end
@@ -114,7 +130,7 @@ RSpec.describe 'hotel.testplanisphere.dev', type: :feature do
114
130
  puppeteer_page = @browser.pages.first
115
131
  puppeteer_page.wait_for_selector('li.nav-item')
116
132
 
117
- reservation_link = puppeteer_page.SS('li.nav-item')[1]
133
+ reservation_link = puppeteer_page.query_selector_all('li.nav-item')[1]
118
134
 
119
135
  await_all(
120
136
  puppeteer_page.async_wait_for_navigation,
@@ -131,7 +147,7 @@ RSpec.describe 'hotel.testplanisphere.dev', type: :feature do
131
147
 
132
148
  # expectation with puppeteer
133
149
  puppeteer_page = @browser.pages.first
134
- body_text = puppeteer_page.Seval('body', '(el) => el.textContent')
150
+ body_text = puppeteer_page.eval_on_selector('body', '(el) => el.textContent')
135
151
  expect(body_text).to include('宿泊プラン一覧')
136
152
  end
137
153
  ```
data/lib/puppeteer.rb CHANGED
@@ -19,12 +19,14 @@ require 'puppeteer/event_callbackable'
19
19
  require 'puppeteer/if_present'
20
20
 
21
21
  # Classes & values.
22
+ require 'puppeteer/aria_query_handler'
22
23
  require 'puppeteer/browser'
23
24
  require 'puppeteer/browser_context'
24
25
  require 'puppeteer/browser_runner'
25
26
  require 'puppeteer/cdp_session'
26
27
  require 'puppeteer/connection'
27
28
  require 'puppeteer/console_message'
29
+ require 'puppeteer/custom_query_handler'
28
30
  require 'puppeteer/devices'
29
31
  require 'puppeteer/dialog'
30
32
  require 'puppeteer/dom_world'
@@ -41,6 +43,7 @@ require 'puppeteer/lifecycle_watcher'
41
43
  require 'puppeteer/mouse'
42
44
  require 'puppeteer/network_manager'
43
45
  require 'puppeteer/page'
46
+ require 'puppeteer/query_handler_manager'
44
47
  require 'puppeteer/remote_object'
45
48
  require 'puppeteer/request'
46
49
  require 'puppeteer/response'
@@ -0,0 +1,71 @@
1
+ class Puppeteer::AriaQueryHandler
2
+ private def normalize(value)
3
+ value.gsub(/ +/, ' ').strip
4
+ end
5
+
6
+ # @param selector [String]
7
+ private def parse_aria_selector(selector)
8
+ known_attributes = %w(name role)
9
+ query_options = {}
10
+ attribute_regexp = /\[\s*(?<attribute>\w+)\s*=\s*"(?<value>\\.|[^"\\]*)"\s*\]/
11
+ default_name = selector.gsub(attribute_regexp) do
12
+ attribute = $1.strip
13
+ value = $2
14
+ unless known_attributes.include?(attribute)
15
+ raise ArgumentError.new("Unkown aria attribute \"#{attribute}\" in selector")
16
+ end
17
+ query_options[attribute.to_sym] = normalize(value)
18
+ ''
19
+ end
20
+
21
+ if default_name.length > 0
22
+ query_options[:name] ||= normalize(default_name)
23
+ end
24
+
25
+ query_options
26
+ end
27
+
28
+ def query_one(element, selector)
29
+ context = element.execution_context
30
+ parse_result = parse_aria_selector(selector)
31
+ res = element.query_ax_tree(accessible_name: parse_result[:name], role: parse_result[:role])
32
+ if res.empty?
33
+ nil
34
+ else
35
+ context.adopt_backend_node_id(res.first['backendDOMNodeId'])
36
+ end
37
+ end
38
+
39
+ def wait_for(dom_world, selector, visible: nil, hidden: nil, timeout: nil)
40
+ binding_function = Puppeteer::DOMWorld::BindingFunction.new(
41
+ name: 'ariaQuerySelector',
42
+ proc: -> (selector) { query_one(dom_world.send(:document), selector) },
43
+ )
44
+ dom_world.send(:wait_for_selector_in_page,
45
+ '(_, selector) => globalThis.ariaQuerySelector(selector)',
46
+ selector,
47
+ visible: visible,
48
+ hidden: hidden,
49
+ timeout: timeout,
50
+ binding_function: binding_function)
51
+ end
52
+
53
+ def query_all(element, selector)
54
+ context = element.execution_context
55
+ parse_result = parse_aria_selector(selector)
56
+ res = element.query_ax_tree(accessible_name: parse_result[:name], role: parse_result[:role])
57
+ if res.empty?
58
+ nil
59
+ else
60
+ promises = res.map do |ax_node|
61
+ context.send(:async_adopt_backend_node_id, ax_node['backendDOMNodeId'])
62
+ end
63
+ await_all(*promises)
64
+ end
65
+ end
66
+
67
+ def query_all_array(element, selector)
68
+ element_handles = query_all(element, selector)
69
+ element.execution_context.evaluate_handle('(...elements) => elements', *element_handles)
70
+ end
71
+ end
@@ -36,7 +36,6 @@ class Puppeteer::Browser
36
36
  @ignore_https_errors = ignore_https_errors
37
37
  @default_viewport = default_viewport
38
38
  @process = process
39
- # @screenshot_task_queue = TaskQueue.new
40
39
  @connection = connection
41
40
  @close_callback = close_callback
42
41
 
@@ -125,7 +124,6 @@ class Puppeteer::Browser
125
124
  session_factory: -> { @connection.create_session(target_info) },
126
125
  ignore_https_errors: @ignore_https_errors,
127
126
  default_viewport: @default_viewport,
128
- screenshot_task_queue: @screenshot_task_queue,
129
127
  )
130
128
  # assert(!this._targets.has(event.targetInfo.targetId), 'Target should not exist before targetCreated');
131
129
  @targets[target_info.target_id] = target
@@ -39,9 +39,12 @@ module Puppeteer::ConcurrentRubyUtils
39
39
  end
40
40
  end
41
41
 
42
- def future(&block)
43
- Concurrent::Promises.future do
44
- block.call
42
+ def future(*args, &block)
43
+ Concurrent::Promises.future(*args) do |*block_args|
44
+ block.call(*block_args)
45
+ rescue Puppeteer::TimeoutError
46
+ # suppress error logging
47
+ raise
45
48
  rescue => err
46
49
  Logger.new($stderr).warn(err)
47
50
  raise err