diff --git a/rb/lib/selenium/webdriver/bidi/browser.rb b/rb/lib/selenium/webdriver/bidi/browser.rb index e5d64e1fdbd9f..f6d9e9202fb5c 100644 --- a/rb/lib/selenium/webdriver/bidi/browser.rb +++ b/rb/lib/selenium/webdriver/bidi/browser.rb @@ -21,6 +21,11 @@ module Selenium module WebDriver class BiDi class Browser + Window = Struct.new(:handle, :active, :height, :width, :x, :y, :state) do + def active? + active + end + end def initialize(bidi) @bidi = bidi end @@ -36,7 +41,24 @@ def user_contexts def remove_user_context(user_context) @bidi.send_cmd('browser.removeUserContext', userContext: user_context) end - end + + def windows + response = @bidi.send_cmd('browser.getClientWindows') + + response['clientWindows'].map do |win_data| + attributes = { + handle: win_data['clientWindow'], + active: win_data['active'], + height: win_data['height'], + width: win_data['width'], + x: win_data['x'], + y: win_data['y'], + state: win_data['state'] + } + Window.new(**attributes) + end + end + end # Browser end # BiDi end # WebDriver end # Selenium diff --git a/rb/lib/selenium/webdriver/bidi/browsing_context.rb b/rb/lib/selenium/webdriver/bidi/browsing_context.rb index ed59d23b381e8..32816740ffe0f 100644 --- a/rb/lib/selenium/webdriver/bidi/browsing_context.rb +++ b/rb/lib/selenium/webdriver/bidi/browsing_context.rb @@ -109,7 +109,7 @@ def activate(context_id: nil) context_id ||= @bridge.window_handle @bidi.send_cmd('browsingContext.activate', context: context_id) end - end + end # BrowsingContext end # BiDi end # WebDriver end # Selenium diff --git a/rb/sig/lib/selenium/webdriver/bidi/browser.rbs b/rb/sig/lib/selenium/webdriver/bidi/browser.rbs index fe6f06548c9ac..a2e51e3d21004 100644 --- a/rb/sig/lib/selenium/webdriver/bidi/browser.rbs +++ b/rb/sig/lib/selenium/webdriver/bidi/browser.rbs @@ -2,6 +2,8 @@ module Selenium module WebDriver class BiDi class Browser + Window: Selenium::WebDriver::BiDi::Browser::Window + @bidi: BiDi def initialize: (BiDi bidi) -> void diff --git a/rb/spec/integration/selenium/webdriver/action_builder_spec.rb b/rb/spec/integration/selenium/webdriver/action_builder_spec.rb index 99ce2fa689e9e..fa2ae81236a5f 100644 --- a/rb/spec/integration/selenium/webdriver/action_builder_spec.rb +++ b/rb/spec/integration/selenium/webdriver/action_builder_spec.rb @@ -38,10 +38,11 @@ module WebDriver expect(driver.find_element(id: 'result').text.strip).to be_empty end - it 'sends keys to element' do + it 'sends keys to element', only: {browser: %i[chrome edge firefox]} do driver.navigate.to url_for('formPage.html') input = driver.find_element(css: '#working') + driver.execute_script('arguments[0].scrollIntoView({block: "center", inline: "nearest"});', input) driver.action.send_keys(input, 'abcd').perform wait.until { input.property(:value).length == 4 } @@ -305,9 +306,9 @@ module WebDriver end end - describe '#scroll_to', only: {browser: %i[chrome edge firefox]} do + describe '#scroll_to' do it 'scrolls to element', - except: {browser: :firefox, reason: 'incorrect MoveTargetOutOfBoundsError'} do + exclusive: {browser: %i[chrome edge], reason: 'incorrect MoveTargetOutOfBoundsError'} do driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html') iframe = driver.find_element(tag_name: 'iframe') @@ -321,7 +322,7 @@ module WebDriver describe '#scroll_by' do it 'scrolls by given amount', - exclude: {driver: :firefox, reason: 'inconsistent behavior between versions'} do + exclusive: {browser: %i[chrome edge], reason: 'inconsistent behavior between versions'} do driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html') footer = driver.find_element(tag_name: 'footer') delta_y = footer.rect.y.round @@ -335,7 +336,7 @@ module WebDriver describe '#scroll_from' do it 'scrolls from element by given amount', - except: {browser: %i[firefox safari], reason: 'incorrect MoveTargetOutOfBoundsError'} do + exclusive: {browser: %i[chrome edge], reason: 'incorrect MoveTargetOutOfBoundsError in Firefox'} do driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html') iframe = driver.find_element(tag_name: 'iframe') scroll_origin = WheelActions::ScrollOrigin.element(iframe) @@ -349,7 +350,7 @@ module WebDriver end it 'scrolls from element by given amount with offset', - except: {browser: %i[firefox safari], reason: 'incorrect MoveTargetOutOfBoundsError'} do + exclusive: {browser: %i[chrome edge], reason: 'incorrect MoveTargetOutOfBoundsError in Firefox'} do driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html') footer = driver.find_element(tag_name: 'footer') scroll_origin = WheelActions::ScrollOrigin.element(footer, 0, -50) diff --git a/rb/spec/integration/selenium/webdriver/bidi/browser_spec.rb b/rb/spec/integration/selenium/webdriver/bidi/browser_spec.rb index 079c419cab4cb..9f535cb1649a3 100644 --- a/rb/spec/integration/selenium/webdriver/bidi/browser_spec.rb +++ b/rb/spec/integration/selenium/webdriver/bidi/browser_spec.rb @@ -24,52 +24,54 @@ module WebDriver class BiDi describe Browser, exclusive: {bidi: true, reason: 'only executed when bidi is enabled'}, only: {browser: %i[chrome edge firefox]} do + after { |example| reset_driver!(example: example) } + + let(:bidi) { driver.bidi } + it 'creates an user context' do - reset_driver!(web_socket_url: true) do |driver| - browser = described_class.new(driver.bidi) - user_context = browser.create_user_context - expect(user_context).not_to be_nil - expect(user_context['userContext']).to be_a String - end + browser = described_class.new(bidi) + user_context = browser.create_user_context + expect(user_context).not_to be_nil + expect(user_context['userContext']).to be_a String end it 'gets user contexts' do - reset_driver!(web_socket_url: true) do |driver| - browser = described_class.new(driver.bidi) - created_context_id = browser.create_user_context['userContext'] - all_context_ids = browser.user_contexts['userContexts'].map { |c| c['userContext'] } + browser = described_class.new(bidi) + created_context_id = browser.create_user_context['userContext'] + all_context_ids = browser.user_contexts['userContexts'].map { |c| c['userContext'] } - expect(all_context_ids).to include(created_context_id) - end + expect(all_context_ids).to include(created_context_id) end it 'removes an user context' do - reset_driver!(web_socket_url: true) do |driver| - browser = described_class.new(driver.bidi) - context_id_to_remove = browser.create_user_context['userContext'] - browser.remove_user_context(context_id_to_remove) - all_ids_after_removal = browser.user_contexts['userContexts'].map { |c| c['userContext'] } + browser = described_class.new(bidi) + context_id_to_remove = browser.create_user_context['userContext'] + browser.remove_user_context(context_id_to_remove) + all_ids_after_removal = browser.user_contexts['userContexts'].map { |c| c['userContext'] } - expect(all_ids_after_removal).not_to include(context_id_to_remove) - end + expect(all_ids_after_removal).not_to include(context_id_to_remove) end it 'throws an error when removing the default user context' do - reset_driver!(web_socket_url: true) do |driver| - browser = described_class.new(driver.bidi) - expect { - browser.remove_user_context('default') - }.to raise_error(Error::WebDriverError, /user context cannot be removed/) - end + browser = described_class.new(bidi) + expect { + browser.remove_user_context('default') + }.to raise_error(Error::WebDriverError, /user context cannot be removed/) end it 'throws an error when removing a non-existent user context' do - reset_driver!(web_socket_url: true) do |driver| - browser = described_class.new(driver.bidi) - expect { - browser.remove_user_context('fake_context') - }.to raise_error(Error::WebDriverError) - end + browser = described_class.new(bidi) + expect { + browser.remove_user_context('fake_context') + }.to raise_error(Error::WebDriverError) + end + + it 'get windows' do + browser = described_class.new(bidi) + windows = browser.windows + active_window = windows.first + + expect(active_window).to be_a(Selenium::WebDriver::BiDi::Browser::Window) end end end diff --git a/rb/spec/integration/selenium/webdriver/window_spec.rb b/rb/spec/integration/selenium/webdriver/window_spec.rb index 8a5b588dd52ea..8f0ffb8748faa 100644 --- a/rb/spec/integration/selenium/webdriver/window_spec.rb +++ b/rb/spec/integration/selenium/webdriver/window_spec.rb @@ -102,7 +102,7 @@ module WebDriver expect(new_rect.height).to eq(target_height) end - it 'can maximize the current window' do + it 'can maximize the current window', except: {browser: :firefox, platform: :macosx} do window.size = old_size = Dimension.new(700, 700) window.maximize