From a2bb5d398e6069984c0c2b3a024900e1b1ee4237 Mon Sep 17 00:00:00 2001 From: YusukeIwaki Date: Mon, 15 Aug 2022 09:12:22 +0900 Subject: [PATCH 1/2] page: fix page.scrollIntoViewIfNeeded method --- lib/puppeteer/element_handle.rb | 28 ++++++++-------------------- lib/puppeteer/remote_object.rb | 4 ++++ spec/integration/click_spec.rb | 2 +- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/lib/puppeteer/element_handle.rb b/lib/puppeteer/element_handle.rb index 0e2baa12..68397466 100644 --- a/lib/puppeteer/element_handle.rb +++ b/lib/puppeteer/element_handle.rb @@ -169,30 +169,11 @@ class ScrollIntoViewError < StandardError; end def scroll_into_view_if_needed js = <<~JAVASCRIPT - async(element, pageJavascriptEnabled) => { + async(element) => { if (!element.isConnected) return 'Node is detached from document'; if (element.nodeType !== Node.ELEMENT_NODE) return 'Node is not of type HTMLElement'; - - if (element.scrollIntoViewIfNeeded) { - element.scrollIntoViewIfNeeded({block: 'center', inline: 'center', behavior: 'instant'}); - } else { - // force-scroll if page's javascript is disabled. - if (!pageJavascriptEnabled) { - element.scrollIntoView({block: 'center', inline: 'center', behavior: 'instant'}); - return false; - } - const visibleRatio = await new Promise(resolve => { - const observer = new IntersectionObserver(entries => { - resolve(entries[0].intersectionRatio); - observer.disconnect(); - }); - observer.observe(element); - }); - if (visibleRatio !== 1.0) - element.scrollIntoView({block: 'center', inline: 'center', behavior: 'instant'}); - } return false; } JAVASCRIPT @@ -200,6 +181,13 @@ def scroll_into_view_if_needed if error raise ScrollIntoViewError.new(error) end + begin + @remote_object.scroll_into_view_if_needed(@client) + rescue => err + # Just ignore 'Node does not have a layout object' for backward-compatibility. + raise unless err.message =~ /Node does not have a layout object/ + end + # clickpoint is often calculated before scrolling is completed. # So, just sleep about 10 frames sleep 0.16 diff --git a/lib/puppeteer/remote_object.rb b/lib/puppeteer/remote_object.rb index 90174272..b7babffb 100644 --- a/lib/puppeteer/remote_object.rb +++ b/lib/puppeteer/remote_object.rb @@ -176,4 +176,8 @@ def converted_arg def set_file_input_files(client, files, backend_node_id) client.send_message('DOM.setFileInputFiles', objectId: @object_id, files: files, backendNodeId: backend_node_id) end + + def scroll_into_view_if_needed(client) + client.send_message('DOM.scrollIntoViewIfNeeded', objectId: @object_id) + end end diff --git a/spec/integration/click_spec.rb b/spec/integration/click_spec.rb index 59f37686..8de93935 100644 --- a/spec/integration/click_spec.rb +++ b/spec/integration/click_spec.rb @@ -111,7 +111,7 @@ page.goto("#{server_prefix}/offscreenbuttons.html") messages = [] page.on('console') do |message| - messages << message.text + messages << message.text if message.log_type == 'log' end 11.times do |i| # We might've scrolled to click a button - reset to (0, 0). From a3353c3f35d51a7c85867da8ec37c5c16fe895be Mon Sep 17 00:00:00 2001 From: YusukeIwaki Date: Mon, 15 Aug 2022 09:14:17 +0900 Subject: [PATCH 2/2] remove unused param --- lib/puppeteer/element_handle.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/puppeteer/element_handle.rb b/lib/puppeteer/element_handle.rb index 68397466..dacc0802 100644 --- a/lib/puppeteer/element_handle.rb +++ b/lib/puppeteer/element_handle.rb @@ -177,7 +177,7 @@ def scroll_into_view_if_needed return false; } JAVASCRIPT - error = evaluate(js, @page.javascript_enabled) # returns String or false + error = evaluate(js) # returns String or false if error raise ScrollIntoViewError.new(error) end