diff --git a/CHANGELOG.md b/CHANGELOG.md index ff58bed3..63de88c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Added - `Ferrum::Page#disable_javascript` disables the JavaScript from the HTML source +- `Ferrum::Page#set_viewport` emulates the viewport ### Changed diff --git a/README.md b/README.md index 8411cb66..bdfa442f 100644 --- a/README.md +++ b/README.md @@ -922,6 +922,21 @@ browser.disable_javascript ``` +#### set_viewport + +Overrides device screen dimensions and emulates viewport. + +* options `Hash` + * :width `Integer`, viewport width. `0` by default + * :height `Integer`, viewport height. `0` by default + * :scale_factor `Float`, device scale factor. `0` by default + * :mobile `Boolean`, whether to emulate mobile device. `false` by default + +```ruby +browser.set_viewport(width: 1000, height: 600, scale_factor: 3) +``` + + ## Frames #### frames : `Array[Frame] | []` diff --git a/lib/ferrum/browser.rb b/lib/ferrum/browser.rb index 89cfa65d..6dd5c0af 100644 --- a/lib/ferrum/browser.rb +++ b/lib/ferrum/browser.rb @@ -28,7 +28,7 @@ class Browser add_script_tag add_style_tag bypass_csp on position position= playback_rate playback_rate= - disable_javascript] => :page + disable_javascript set_viewport] => :page delegate %i[default_user_agent] => :process attr_reader :client, :process, :contexts, :options, :window_size, :base_url diff --git a/lib/ferrum/page.rb b/lib/ferrum/page.rb index 08d4d3c5..46ea4720 100644 --- a/lib/ferrum/page.rb +++ b/lib/ferrum/page.rb @@ -133,6 +133,30 @@ def close @client.close end + # + # Overrides device screen dimensions and emulates viewport according to parameters + # + # Read more [here](https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setDeviceMetricsOverride). + # + # @param [Integer] width width value in pixels. 0 disables the override + # + # @param [Integer] height height value in pixels. 0 disables the override + # + # @param [Float] scale_factor device scale factor value. 0 disables the override + # + # @param [Boolean] mobile whether to emulate mobile device + # + def set_viewport(width:, height:, scale_factor: 0, mobile: false) + command( + "Emulation.setDeviceMetricsOverride", + slowmoable: true, + width: width, + height: height, + deviceScaleFactor: scale_factor, + mobile: mobile + ) + end + def resize(width: nil, height: nil, fullscreen: false) if fullscreen width, height = document_size @@ -142,11 +166,7 @@ def resize(width: nil, height: nil, fullscreen: false) set_window_bounds(width: width, height: height) end - command("Emulation.setDeviceMetricsOverride", slowmoable: true, - width: width, - height: height, - deviceScaleFactor: 0, - mobile: false) + set_viewport(width: width, height: height) end # diff --git a/spec/page_spec.rb b/spec/page_spec.rb index ecddd314..8d6d0e26 100644 --- a/spec/page_spec.rb +++ b/spec/page_spec.rb @@ -186,4 +186,13 @@ expect(page.main_frame.body).to eq("
text
") end end + + describe "#set_viewport" do + it "overrides the viewport size" do + page.set_viewport(width: 500, height: 300, scale_factor: 2) + + expect(page.viewport_size).to eq([500, 300]) + expect(page.device_pixel_ratio).to eq(2) + end + end end diff --git a/spec/support/views/initial_alert.erb b/spec/support/views/initial_alert.erb deleted file mode 100644 index 5c61d95c..00000000 --- a/spec/support/views/initial_alert.erb +++ /dev/null @@ -1,11 +0,0 @@ - - - -