Dhalang 0.3.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e81627f9004f346443d46b9ab0befaec1c11c95a6c81521c9e1340901d97427
4
- data.tar.gz: adb156ead06f2b4886f7ce0972b4477f56a1a793d3fa4fd9fe289e899088f309
3
+ metadata.gz: c68cc819480b82b9d2693cc4689e54237650e2cc2f4d1e6e40297b711e4e9c76
4
+ data.tar.gz: c5af3754067a98ccc3af4c93266827e498888d26c16557bae82b6defa3c818b3
5
5
  SHA512:
6
- metadata.gz: 6019c5635f2020d8c49c5dfc4cab09f4bd59c5445402016e894579fd4a68097b2675559950aa7f2a8cdf014db4ae1d0381682ecbcc04e7de6bf0e57195caf1fa
7
- data.tar.gz: c833cdfb54c3f4f99b3e047fa1381555025c1faf48f723ec38eff8a29ad572b20b22d9dfada76fda0b71d9c45b734ea3fbae378ef5d4ca7872aa07f1abd698e6
6
+ metadata.gz: b483a6aa15f278dd3d49529e539160b999ed30cfc26a8e32ec77b9a862a7b4ae67c274f9fc7a6d46c207f204ed0882d3badf2a1491aca2b46ba6ae7504074190
7
+ data.tar.gz: e432a18e55b081e3eafbb4085483b406f879be835c0d00647ca38a38f9d7ec2ed3caefbc6b2f7a78362422eb6290b9473202aa5a3c27a6976baeef9784e58728
data/.travis.yml CHANGED
@@ -1,8 +1,12 @@
1
1
  language: ruby
2
+ node_js:
3
+ - node
2
4
  rvm:
3
5
  - 2.6
4
6
  addons:
5
7
  chrome: stable
8
+ before_install:
9
+ - nvm install v15.0.1
6
10
  install:
7
11
  - bundle install
8
12
  - npm install
data/Dhalang.gemspec CHANGED
@@ -13,8 +13,6 @@ Gem::Specification.new do |spec|
13
13
  spec.summary = "Ruby wrapper for Puppeteer. Generate screenshots and PDF's from HTML!"
14
14
  spec.homepage = "https://github.com/NielsSteensma/Dhalang"
15
15
 
16
-
17
-
18
16
  # Specify which files should be added to the gem when it is released.
19
17
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
18
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- Dhalang (0.2.0)
4
+ Dhalang (0.6.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -49,4 +49,4 @@ DEPENDENCIES
49
49
  rspec (~> 3.0)
50
50
 
51
51
  BUNDLED WITH
52
- 1.17.2
52
+ 1.17.3
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019 NielsS
3
+ Copyright (c) 2021 NielsS
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -3,11 +3,14 @@
3
3
  > Dhalang is a Ruby wrapper for Google's Puppeteer.
4
4
 
5
5
 
6
+
6
7
  ## Features
7
8
  * Generate PDFs from pages
8
9
  * Generate PDFs from html ( external images/stylesheets supported )
9
10
  * Capture a screenshot of a webpage
10
11
 
12
+
13
+
11
14
  ## Installation
12
15
  Add this line to your application's Gemfile:
13
16
 
@@ -21,7 +24,7 @@ Install puppeteer in your application's root directory:
21
24
 
22
25
  $ npm install puppeteer
23
26
 
24
- <sub>NodeJS v7.6.0 or greater is required</sub>
27
+ <sub>NodeJS v10.18.1 or greater is required</sub>
25
28
  ## Usage
26
29
  __Get a PDF of a website url__
27
30
  `Dhalang::PDF.get_from_url("https://www.google.com")`
@@ -38,7 +41,49 @@ __Get a JPEG screenshot of a website__
38
41
 
39
42
  All methods return a string containing the PDF or JPEG/PNG in binary.
40
43
 
41
- To return the PDF from a Rails controller you can do the following:
44
+
45
+
46
+ ## Custom PDF/screenshot options
47
+ To override the default options that are set by Dhalang you can pass as last argument a hash with the custom options you want to set.
48
+
49
+ For example to set custom margins for PDFs:
50
+
51
+ `Dhalang::PDF.get_from_url("https://www.google.com", {margin: { top: 100, right: 100, bottom: 100, left: 100}})
52
+ `
53
+
54
+ For example to only take a screenshot of the visible part of the page:
55
+ `Dhalang::Screenshot.get_from_url_as_png("https://www.google.com", {fullPage: false})
56
+ `
57
+
58
+ A list of all possible PDF options that can be set, can be found at: https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagepdfoptions
59
+
60
+ A list of all possible screenshot options that can be set, can be found at: https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagescreenshotoptions
61
+
62
+
63
+
64
+
65
+ ## Custom user options
66
+ You may want to change the way Dhalang interacts with Puppeteer in general. User options can be set by providing them in a hash as last argument to any calls you make to the library. Are you setting both custom PDF and user options? Then they should be passed as a single hash.
67
+
68
+ For example to set a custom navigation timeout:
69
+ `Dhalang::Screenshot.get_from_url_as_jpeg("https://www.google.com", {navigationTimeout: 20000})`
70
+
71
+ Below table lists all possible configuration parameters that can be set:
72
+ | Key | Description | Default |
73
+ |--------------------|-----------------------------------------------------------------------------------------|---------------------------------|
74
+ | navigationTimeout | Amount of milliseconds until Puppeteer while timeout when navigating to the given page | 10000 |
75
+ | navigationWaitForSelector | If set, Dhalang will wait for the specified selector to appear before creating the screenshot or PDF | None |
76
+ | navigationWaitForXPath | If set, Dhalang will wait for the specified XPath to appear before creating the screenshot or PDF | None |
77
+ | userAgent | User agent to send with the request | Default Puppeteer one |
78
+ | isHeadless | Indicates if Chromium should be launched headless | true |
79
+ | isAutoHeight | When set to true the height of generated PDFs will be based on the scrollHeight property of the document body | false |
80
+ | viewPort | Custom viewport to use for the request | Default Puppeteer one |
81
+ | httpAuthenticationCredentials | Custom HTTP authentication credentials to use for the request | None |
82
+
83
+
84
+
85
+ ## Examples of using Dhalang
86
+ To return a PDF from a Rails controller you can do the following:
42
87
  ```
43
88
  def example_controller_method
44
89
  binary_pdf = Dhalang::PDF.get_from_url("https://www.google.com")
@@ -46,7 +91,7 @@ def example_controller_method
46
91
  end
47
92
  ```
48
93
 
49
- To return the PNG from a Rails controller you can do the following:
94
+ To return a PNG from a Rails controller you can do the following:
50
95
  ```
51
96
  def example_controller_method
52
97
  binary_png = Dhalang::Screenshot.get_from_url_as_png("https://www.google.com")
@@ -54,7 +99,7 @@ def example_controller_method
54
99
  end
55
100
  ```
56
101
 
57
- To return the JPEG from a Rails controller you can do the following:
102
+ To return a JPEG from a Rails controller you can do the following:
58
103
  ```
59
104
  def example_controller_method
60
105
  binary_jpeg = Dhalang::Screenshot.get_from_url_as_jpeg("https://www.google.com")
data/lib/Dhalang.rb CHANGED
@@ -4,8 +4,11 @@ module Dhalang
4
4
  require_relative 'Dhalang/version'
5
5
  require_relative 'Dhalang/url_utils'
6
6
  require_relative 'Dhalang/file_utils'
7
+ require_relative 'Dhalang/error'
7
8
  require_relative 'Dhalang/puppeteer'
8
9
  require 'uri'
9
10
  require 'tempfile'
10
11
  require 'shellwords'
11
- end
12
+ require 'json'
13
+ require 'open3'
14
+ end
@@ -0,0 +1 @@
1
+ class DhalangError < StandardError; end
@@ -3,15 +3,94 @@ module Dhalang
3
3
  class Puppeteer
4
4
  NODE_MODULES_PATH = Dir.pwd + '/node_modules/'.freeze
5
5
  private_constant :NODE_MODULES_PATH
6
-
6
+
7
+ USER_OPTIONS = {
8
+ navigationTimeout: 10000,
9
+ navigationWaitUntil: 'load',
10
+ navigationWaitForSelector: '',
11
+ navigationWaitForXPath: '',
12
+ userAgent: '',
13
+ isHeadless: true,
14
+ viewPort: '',
15
+ httpAuthenticationCredentials: '',
16
+ isAutoHeight: false
17
+ }
18
+ private_constant :USER_OPTIONS
19
+
20
+ DEFAULT_PDF_OPTIONS = {
21
+ scale: 1,
22
+ displayHeaderFooter: false,
23
+ headerTemplate: '',
24
+ footerTemplate: '',
25
+ printBackground: true,
26
+ landscape: false,
27
+ pageRanges: '',
28
+ format: 'A4',
29
+ width: '',
30
+ height: '',
31
+ margin: { top: 36, right: 36, bottom: 20, left: 36 },
32
+ preferCSSPageSize: true,
33
+ omitBackground: false
34
+ }
35
+ private_constant :DEFAULT_PDF_OPTIONS
36
+
37
+ DEFAULT_PNG_OPTIONS = {
38
+ fullPage: true,
39
+ clip: nil,
40
+ omitBackground: false
41
+ }
42
+ private_constant :DEFAULT_PNG_OPTIONS
43
+
44
+ DEFAULT_JPEG_OPTIONS = {
45
+ quality: 100,
46
+ fullPage: true,
47
+ clip: nil,
48
+ omitBackground: false
49
+ }
50
+ private_constant :DEFAULT_JPEG_OPTIONS
51
+
52
+
7
53
  # Launches a new Node process, executing the (Puppeteer) script under the given script_path.
8
54
  #
9
55
  # @param [String] page_url The url to pass to the goTo method of Puppeteer.
10
56
  # @param [String] script_path The absolute path of the JS script to execute.
11
- # @param [String] temp_file_path The absolute path of the temp file to use to write any actions tom from Puppeteer.
57
+ # @param [String] temp_file_path The absolute path of the temp file to use to write any actions from Puppeteer.
12
58
  # @param [String] temp_file_extension The extension of the temp file.
13
- def self.visit(page_url, script_path, temp_file_path, temp_file_extension)
14
- system("node #{script_path} #{Shellwords.escape(NODE_MODULES_PATH)} #{page_url} #{Shellwords.escape(temp_file_path)} #{Shellwords.escape(temp_file_extension)}")
59
+ # @param [Object] options Set of options to use, configurable by the user.
60
+ def self.visit(page_url, script_path, temp_file_path, temp_file_extension, options)
61
+ configuration = create_configuration(page_url, script_path, temp_file_path, temp_file_extension, options)
62
+
63
+ command = "node #{script_path} #{Shellwords.escape(configuration)}"
64
+
65
+ Open3.popen2e(command) do |_stdin, stdouterr, wait|
66
+ return nil if wait.value.success?
67
+
68
+ output = stdouterr.read.strip
69
+ output = nil if output == ''
70
+ message = output || "Exited with status #{wait.value.exitstatus}"
71
+ raise DhalangError, message
72
+ end
73
+ end
74
+
75
+
76
+ # Returns a JSON string with the configuration to use within the Puppeteer script.
77
+ #
78
+ # @param [String] page_url The url to pass to the goTo method of Puppeteer.
79
+ # @param [String] script_path The absolute path of the JS script to execute.
80
+ # @param [String] temp_file_path The absolute path of the temp file to use to write any actions from Puppeteer.
81
+ # @param [String] temp_file_extension The extension of the temp file.
82
+ # @param [Hash] options Set of options to use, configurable by the user.
83
+ private_class_method def self.create_configuration(page_url, script_path, temp_file_path, temp_file_extension, options)
84
+ {
85
+ webPageUrl: page_url,
86
+ tempFilePath: temp_file_path,
87
+ puppeteerPath: NODE_MODULES_PATH,
88
+ imageType: temp_file_extension,
89
+ userOptions: USER_OPTIONS.map { |option, value| [option, options.has_key?(option) ? options[option] : value]}.to_h,
90
+ pdfOptions: DEFAULT_PDF_OPTIONS.map { |option, value| [option, options.has_key?(option) ? options[option] : value] }.to_h,
91
+ pngOptions: DEFAULT_PNG_OPTIONS.map { |option, value| [option, options.has_key?(option) ? options[option] : value] }.to_h,
92
+ jpegOptions: DEFAULT_JPEG_OPTIONS.map { |option, value| [option, options.has_key?(option) ? options[option] : value] }.to_h
93
+ }.to_json
15
94
  end
16
95
  end
17
- end
96
+ end
@@ -1,3 +1,3 @@
1
1
  module Dhalang
2
- VERSION = "0.3.0"
2
+ VERSION = "0.6.1"
3
3
  end
data/lib/PDF.rb CHANGED
@@ -6,25 +6,27 @@ module Dhalang
6
6
 
7
7
  # Captures the full webpage under the given url as PDF.
8
8
  #
9
- # @param [String] url The url to get as PDF.
9
+ # @param [String] url The url to get as PDF.
10
+ # @param [Hash] options User configurable options.
10
11
  #
11
12
  # @return [String] The PDF that was created as binary.
12
- def self.get_from_url(url)
13
+ def self.get_from_url(url, options = {})
13
14
  UrlUtils.validate(url)
14
- get(url)
15
+ get(url, options)
15
16
  end
16
17
 
17
18
  # Captures the full HTML as PDF.
18
19
  # Useful when creating dynamic content, for example invoices.
19
20
  #
20
- # @param [String] html The html to get as PDF.
21
+ # @param [String] html The html to get as PDF.
22
+ # @param [Hash] options User configurable options.
21
23
  #
22
24
  # @return [String] The PDF that was created as binary.
23
- def self.get_from_html(html)
25
+ def self.get_from_html(html, options = {})
24
26
  html_file = FileUtils.create_temp_file("html", html)
25
27
  url = "file://" + html_file.path
26
28
  begin
27
- binary_pdf_content = get(url)
29
+ binary_pdf_content = get(url, options)
28
30
  ensure
29
31
  FileUtils.delete(html_file)
30
32
  end
@@ -34,13 +36,14 @@ module Dhalang
34
36
 
35
37
  # Groups and executes the logic for creating a PDF of a webpage.
36
38
  #
37
- # @param [String] url The url to create a PDF for.
39
+ # @param [String] url The url to create a PDF for.
40
+ # @param [Hash] options Set of options to use, passed by the user of this library.
38
41
  #
39
42
  # @return [String] The PDF that was created as binary.
40
- private_class_method def self.get(url)
43
+ private_class_method def self.get(url, options)
41
44
  temp_file = FileUtils.create_temp_file("pdf")
42
45
  begin
43
- Puppeteer.visit(url, PUPPETEER_SCRIPT_PATH, temp_file.path, "pdf")
46
+ Puppeteer.visit(url, PUPPETEER_SCRIPT_PATH, temp_file.path, "pdf", options)
44
47
  binary_pdf_content = FileUtils.read_binary(temp_file.path)
45
48
  ensure
46
49
  FileUtils.delete(temp_file)
data/lib/Screenshot.rb CHANGED
@@ -7,37 +7,51 @@ module Dhalang
7
7
  # Captures a full JPEG screenshot of the webpage under the given url.
8
8
  #
9
9
  # @param [String] url The url to take a screenshot of.
10
+ # @param [Hash] options User configurable options.
10
11
  #
11
12
  # @return [String] the screenshot that was taken as binary.
12
- def self.get_from_url_as_jpeg(url)
13
- get(url, "jpeg")
13
+ def self.get_from_url_as_jpeg(url, options = {})
14
+ get(url, "jpeg", options)
14
15
  end
15
16
 
16
17
  # Captures a full PNG screenshot of the webpage under the given url.
17
18
  #
18
19
  # @param [String] url The url to take a screenshot of.
20
+ # @param [Hash] options User configurable options.
19
21
  #
20
22
  # @return [String] The screenshot that was taken as binary.
21
- def self.get_from_url_as_png(url)
22
- get(url, "png")
23
+ def self.get_from_url_as_png(url, options = {})
24
+ get(url, "png", options)
23
25
  end
24
26
 
25
27
  # Groups and executes the logic for taking a screenhot of a webpage.
26
28
  #
27
29
  # @param [String] url The url to take a screenshot of.
28
30
  # @param [String] image_type The image type to use for storing the screenshot.
31
+ # @param [Hash] options Set of options to use, passed by the user of this library.
29
32
  #
30
33
  # @return [String] The screenshot that was taken as binary.
31
- private_class_method def self.get(url, image_type)
34
+ private_class_method def self.get(url, image_type, options)
32
35
  UrlUtils.validate(url)
36
+ validate_options(options)
33
37
  temp_file = FileUtils.create_temp_file(image_type)
34
38
  begin
35
- Puppeteer.visit(url, PUPPETEER_SCRIPT_PATH, temp_file.path, image_type)
39
+ Puppeteer.visit(url, PUPPETEER_SCRIPT_PATH, temp_file.path, image_type, options)
36
40
  binary_image_content = FileUtils.read_binary(temp_file.path)
37
41
  ensure
38
42
  FileUtils.delete(temp_file)
39
43
  end
40
44
  return binary_image_content
41
45
  end
46
+
47
+ # Raises an error if the given options might conflict with the Puppeteer configuration.
48
+ #
49
+ # @param [Hash] options The options to validate
50
+ private_class_method def self.validate_options(options)
51
+ symbolized_options = options.transform_keys(&:to_sym)
52
+ if symbolized_options.has_key?(:type)
53
+ raise DhalangError, 'Invalid option set: "type"'
54
+ end
55
+ end
42
56
  end
43
57
  end
data/lib/js/dhalang.js CHANGED
@@ -1,54 +1,146 @@
1
1
  /**
2
2
  * @typedef {Object} Configuration
3
- * @property {string} webPageUrl - The url of the webpage to visit.
4
- * @property {string} tempFilePath - The path of the tempfile to write the screenshot/pdf to.
5
- * @property {string} puppeteerModulePath - The path of the Puppeteer module.
6
- * @property {string} imageType - The type of image to save ( undefined for pdfgenerator ).
3
+ * @property {string} webPageUrl - The url of the webpage to visit.
4
+ * @property {string} tempFilePath - The path of the tempfile to write the screenshot/pdf to.
5
+ * @property {string} puppeteerModulePath - The path of the Puppeteer module.
6
+ * @property {string} imageType - The type of image to save ( undefined for pdfgenerator ).
7
+ * @property {UserOptions} userOptions - User defined and default parameters to use when navigating to pages.
8
+ * @property {Object} pdfOptions - User defined and default parameters to use when creating PDFs. Note: Do not use directly, rather use {@link getConfiguredPdfOptions}.
9
+ * @property {Object} pngOptions - User defined and default parameters to use when creating PNGs.
10
+ * @property {Object} jpegOptions - User defined and default parameters to use when creating JPEGs.
11
+ */
12
+
13
+ /**
14
+ * @typedef {Object} UserOptions
15
+ * @property {number} navigationTimeout - Maximum in milliseconds until navigation times out, we use a default of 10 seconds as timeout.
16
+ * @property {string} navigationWaitUntil - Determines when the navigation was finished, we wait here until the Window.load event is fired ( meaning all images, stylesheet, etc was loaded ).
17
+ * @property {string} navigationWaitForSelector - If set, specifies the selector Puppeteer should wait for to appear before continuing.
18
+ * @property {string} navigationWaitForXPath - If set, specifies the XPath Puppeteer should wait for to appear before continuing.
19
+ * @property {string} userAgent - The user agent to send with requests.
20
+ * @property {boolean} isHeadless - Indicates if Puppeteer should launch Chromium in headless mode.
21
+ * @property {Object} viewPort - The view port to use.
22
+ * @property {Object} httpAuthenticationCredentials - The credentials to use for HTTP authentication.
23
+ * @property {boolean} isAutoHeight - The height is automatically set
7
24
  */
8
25
 
9
26
  /**
10
27
  * @typedef {Object} NavigationParameters
11
- * @property {number} timeout - Maximum in milliseconds until navigation times out, we use a default of 10 seconds as timeout.
12
- * @property {string} waituntil - Determines when the navigation was finished, we wait here until the Window.load event is fired ( meaning all images, stylesheet, etc was loaded ).
28
+ * @property {number} timeout - Maximum in milliseconds until navigation times out, we use a default of 10 seconds as timeout.
29
+ * @property {string} waituntil - Determines when the navigation was finished, we wait here until the Window.load event is fired ( meaning all images, stylesheet, etc was loaded ).
30
+ */
31
+
32
+ /**
33
+ * @typedef {Object} WaitingParameters
34
+ * @property {number} timeout - Maximum in milliseconds until navigation times out, we use a default of 10 seconds as timeout.
13
35
  */
14
36
 
15
37
  /**
16
- * Generates a configuration object based on the given process arguments from Ruby.
17
- * @param {Boolean} isForScreenshotGenerator - Indicates if this configuration is for a screenshot generator.
38
+ * Parses the given configuration process argument from Ruby to a JS object.
18
39
  * @returns {Configuration}
19
- * The generated configuration object.
40
+ * The configuration object.
20
41
  */
21
- exports.getConfiguration = function (isForScreenshotGenerator) {
22
- return {
23
- puppeteerPath: process.argv[2],
24
- webPageUrl: process.argv[3],
25
- tempFilePath: process.argv[4],
26
- imageType: isForScreenshotGenerator ? process.argv[5] : undefined
27
- }
42
+ exports.getConfiguration = function () {
43
+ return JSON.parse(process.argv[2])
28
44
  }
29
45
 
30
46
  /**
31
47
  * Launches Puppeteer and returns its instance.
32
- * @param {string} puppeteerModulePath - The path puppeteer is under.
33
- * @returns {Promise<Object>}
48
+ * @param {UserOptions} configuration - The configuration to use.
49
+ * @returns {Promise<Object>}
34
50
  * The launched instance of Puppeteer.
35
51
  */
36
- exports.launchPuppeteer = async function (puppeteerModulePath) {
37
- module.paths.push(puppeteerModulePath);
52
+ exports.launchPuppeteer = async function (configuration) {
53
+ module.paths.push(configuration.puppeteerPath);
38
54
  const puppeteer = require('puppeteer');
55
+ const launchArgs = ['--no-sandbox', '--disable-setuid-sandbox'];
39
56
  return await puppeteer.launch({
40
- args: ['--no-sandbox', '--disable-setuid-sandbox']
57
+ args: launchArgs,
58
+ headless: configuration.userOptions.isHeadless
41
59
  });
42
60
  }
43
61
 
44
62
  /**
45
- * Returns a new object containing the navigation parameters to use when navigating with Puppeteer to web pages.
63
+ * Configures the given Puppeteer page object.
64
+ * @param {Object} page - The Puppeteer page object to configure.
65
+ * @param {UserOptions} userOptions - The user options to use.
66
+ */
67
+ exports.configure = async function (page, userOptions) {
68
+ if (userOptions.userAgent !== "") {
69
+ await page.setUserAgent(userOptions.userAgent)
70
+ }
71
+
72
+ if (userOptions.viewPort !== "") {
73
+ await page.setViewport(userOptions.viewPort)
74
+ }
75
+
76
+ if (userOptions.httpAuthenticationCredentials !== "") {
77
+ await page.authenticate(userOptions.authenticationCredentials)
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Makes the Puppeteer page object open the url with the specified navigation logic as specified in the given configuration.
83
+ * @param {Object} page - The Puppeteer page object to use for navigation.
84
+ * @param {Configuration} configuration - The configuration to use.
85
+ */
86
+ exports.navigate = async function (page, configuration) {
87
+ const navigationWaitForSelector = configuration.userOptions.navigationWaitForSelector;
88
+ const navigationWaitForXPath = configuration.userOptions.navigationWaitForXPath;
89
+
90
+ await page.goto(configuration.webPageUrl, this.getNavigationParameters(configuration));
91
+
92
+ if (navigationWaitForSelector !== "") {
93
+ await page.waitForSelector(navigationWaitForSelector, this.getWaitingParameters(configuration));
94
+ } else if (navigationWaitForXPath !== "") {
95
+ await page.waitForXPath(navigationWaitForXPath, this.getWaitingParameters(configuration));
96
+ } else {
97
+ await page.waitForTimeout(250);
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Returns the PDF options to pass to Puppeteer based on the set user options and the documents body.
103
+ * @param {Object} page - The Puppeteer page to configure.
104
+ * @param {UserOptions} configuration - The configuration to use.
105
+ * @returns {Object} - pdfOptions
106
+ */
107
+ exports.getConfiguredPdfOptions = async function (page, configuration) {
108
+ const pdfOptions = configuration.pdfOptions
109
+
110
+ if (configuration.userOptions.isAutoHeight === true) {
111
+ const pageHeight = await page.evaluate(() => {
112
+ return Math.max(document.body.scrollHeight, document.body.offsetHeight);
113
+ })
114
+ if (pageHeight) {
115
+ pdfOptions['height'] = pageHeight + 1 + 'px'
116
+ }
117
+ }
118
+
119
+ return pdfOptions
120
+ }
121
+
122
+ /**
123
+ * Extracts the navigation parameters from the configuration in a format that is usable by Puppeteer.
124
+ * @param {Configuration} configuration - The configuration to extract the navigation parameters from.
46
125
  * @returns {NavigationParameters}
47
- * The navigation parameters to use.
126
+ * The extracted navigation parameters.
127
+ */
128
+ exports.getNavigationParameters = function (configuration) {
129
+ return {
130
+ timeout: configuration.userOptions.navigationTimeout,
131
+ waituntil: configuration.userOptions.navigationWaitUntil
132
+ }
133
+ }
134
+
135
+
136
+ /**
137
+ * Extracts the waiting parameters from the configuration in a format that is usable by Puppeteer.
138
+ * @param {Configuration} configuration - The configuration to extract the waiting parameters from.
139
+ * @returns {WaitingParameters}
140
+ * The extracted waiting parameters.
48
141
  */
49
- exports.getNavigationParameters = function () {
142
+ exports.getWaitingParameters = function (configuration) {
50
143
  return {
51
- timeout: 10000,
52
- waitUntil: 'load'
144
+ timeout: configuration.userOptions.navigationTimeout
53
145
  }
54
146
  }