puppeteer-ruby 0.37.2 → 0.39.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -72,7 +72,15 @@ class Puppeteer::HTTPRequest
72
72
  end
73
73
 
74
74
  attr_reader :internal
75
- attr_reader :url, :resource_type, :method, :post_data, :headers, :response, :frame
75
+ attr_reader :url, :resource_type, :method, :post_data, :headers, :response, :frame, :initiator
76
+
77
+ def inspect
78
+ values = %i[request_id method url].map do |sym|
79
+ value = instance_variable_get(:"@#{sym}")
80
+ "@#{sym}=#{value}"
81
+ end
82
+ "#<Puppeteer::HTTPRequest #{values.join(' ')}>"
83
+ end
76
84
 
77
85
  private def assert_interception_allowed
78
86
  unless @allow_interception
@@ -27,31 +27,41 @@ module Puppeteer::Launcher
27
27
  @chrome_arg_options.args.dup
28
28
  end
29
29
 
30
- #
31
- # let temporaryUserDataDir = null;
32
-
33
30
  if chrome_arguments.none? { |arg| arg.start_with?('--remote-debugging-') }
34
31
  if @launch_options.pipe?
35
32
  chrome_arguments << '--remote-debugging-pipe'
36
33
  else
37
- chrome_arguments << '--remote-debugging-port=0'
34
+ chrome_arguments << "--remote-debugging-port=#{@chrome_arg_options.debugging_port}"
38
35
  end
39
36
  end
40
37
 
41
- temporary_user_data_dir = nil
42
- if chrome_arguments.none? { |arg| arg.start_with?('--user-data-dir') }
43
- temporary_user_data_dir = Dir.mktmpdir('puppeteer_dev_chrome_profile-')
44
- chrome_arguments << "--user-data-dir=#{temporary_user_data_dir}"
38
+ user_data_dir = chrome_arguments.find { |arg| arg.start_with?('--user-data-dir') }
39
+ if user_data_dir
40
+ user_data_dir = user_data_dir.split('=').last
41
+ unless File.exist?(user_data_dir)
42
+ raise ArgumentError.new("Chrome user data dir not found at '#{user_data_dir}'")
43
+ end
44
+ using_temp_user_data_dir = false
45
+ else
46
+ user_data_dir = Dir.mktmpdir('puppeteer_dev_chrome_profile-', ENV['PUPPETEER_TMP_DIR'])
47
+ chrome_arguments << "--user-data-dir=#{user_data_dir}"
48
+ using_temp_user_data_dir = true
45
49
  end
46
50
 
47
51
  chrome_executable =
48
52
  if @launch_options.channel
49
53
  executable_path_for_channel(@launch_options.channel.to_s)
50
54
  else
51
- @launch_options.executable_path || executable_path_for_channel('chrome')
55
+ @launch_options.executable_path || fallback_executable_path
52
56
  end
53
57
  use_pipe = chrome_arguments.include?('--remote-debugging-pipe')
54
- runner = Puppeteer::BrowserRunner.new(chrome_executable, chrome_arguments, temporary_user_data_dir)
58
+ runner = Puppeteer::BrowserRunner.new(
59
+ false,
60
+ chrome_executable,
61
+ chrome_arguments,
62
+ user_data_dir,
63
+ using_temp_user_data_dir,
64
+ )
55
65
  runner.start(
56
66
  handle_SIGHUP: @launch_options.handle_SIGHUP?,
57
67
  handle_SIGTERM: @launch_options.handle_SIGTERM?,
@@ -61,30 +71,39 @@ module Puppeteer::Launcher
61
71
  pipe: use_pipe,
62
72
  )
63
73
 
74
+ browser =
75
+ begin
76
+ connection = runner.setup_connection(
77
+ use_pipe: use_pipe,
78
+ timeout: @launch_options.timeout,
79
+ slow_mo: @browser_options.slow_mo,
80
+ preferred_revision: @preferred_revision,
81
+ )
82
+
83
+ Puppeteer::Browser.create(
84
+ connection: connection,
85
+ context_ids: [],
86
+ ignore_https_errors: @browser_options.ignore_https_errors?,
87
+ default_viewport: @browser_options.default_viewport,
88
+ process: runner.proc,
89
+ close_callback: -> { runner.close },
90
+ )
91
+ rescue
92
+ runner.kill
93
+ raise
94
+ end
95
+
64
96
  begin
65
- connection = runner.setup_connection(
66
- use_pipe: use_pipe,
97
+ browser.wait_for_target(
98
+ predicate: ->(target) { target.type == 'page' },
67
99
  timeout: @launch_options.timeout,
68
- slow_mo: @browser_options.slow_mo,
69
- preferred_revision: @preferred_revision,
70
- )
71
-
72
- browser = Puppeteer::Browser.create(
73
- connection: connection,
74
- context_ids: [],
75
- ignore_https_errors: @browser_options.ignore_https_errors?,
76
- default_viewport: @browser_options.default_viewport,
77
- process: runner.proc,
78
- close_callback: -> { runner.close },
79
100
  )
80
-
81
- browser.wait_for_target(predicate: ->(target) { target.type == 'page' })
82
-
83
- browser
84
101
  rescue
85
- runner.kill
102
+ browser.close
86
103
  raise
87
104
  end
105
+
106
+ browser
88
107
  end
89
108
 
90
109
  class DefaultArgs
@@ -216,10 +235,14 @@ module Puppeteer::Launcher
216
235
  if channel
217
236
  executable_path_for_channel(channel.to_s)
218
237
  else
219
- executable_path_for_channel('chrome')
238
+ fallback_executable_path
220
239
  end
221
240
  end
222
241
 
242
+ private def fallback_executable_path
243
+ executable_path_for_channel('chrome')
244
+ end
245
+
223
246
  CHROMIUM_CHANNELS = {
224
247
  windows: {
225
248
  'chrome' => "#{ENV['PROGRAMFILES']}\\Google\\Chrome\\Application\\chrome.exe",
@@ -236,7 +259,16 @@ module Puppeteer::Launcher
236
259
  'msedge' => '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',
237
260
  },
238
261
  linux: {
239
- 'chrome' => '/opt/google/chrome/chrome',
262
+ 'chrome' => -> {
263
+ Puppeteer::ExecutablePathFinder.new(
264
+ 'google-chrome-stable',
265
+ 'google-chrome',
266
+ 'chrome',
267
+ 'chromium-freeworld',
268
+ 'chromium-browser',
269
+ 'chromium',
270
+ ).find_first
271
+ },
240
272
  'chrome-beta' => '/opt/google/chrome-beta/chrome',
241
273
  'chrome-dev' => '/opt/google/chrome-unstable/chrome',
242
274
  },
@@ -254,6 +286,10 @@ module Puppeteer::Launcher
254
286
  end
255
287
 
256
288
  chrome_path = chrome_path_map[channel]
289
+ if chrome_path.is_a?(Proc)
290
+ chrome_path = chrome_path.call
291
+ end
292
+
257
293
  unless chrome_path
258
294
  raise ArgumentError.new("Invalid channel: '#{channel}'. Allowed channel is #{chrome_path_map.keys}")
259
295
  end
@@ -34,9 +34,10 @@ module Puppeteer::Launcher
34
34
  if @headless.nil?
35
35
  @headless = !@devtools
36
36
  end
37
+ @debugging_port = options[:debugging_port] || 0
37
38
  end
38
39
 
39
- attr_reader :args, :user_data_dir
40
+ attr_reader :args, :user_data_dir, :debugging_port
40
41
 
41
42
  def headless?
42
43
  @headless