Skip to content

Commit b562a93

Browse files
authored
[rb] BiDi get client windows (#16211)
1 parent d6b9bc4 commit b562a93

File tree

6 files changed

+67
-40
lines changed

6 files changed

+67
-40
lines changed

rb/lib/selenium/webdriver/bidi/browser.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ module Selenium
2121
module WebDriver
2222
class BiDi
2323
class Browser
24+
Window = Struct.new(:handle, :active, :height, :width, :x, :y, :state) do
25+
def active?
26+
active
27+
end
28+
end
2429
def initialize(bidi)
2530
@bidi = bidi
2631
end
@@ -36,7 +41,24 @@ def user_contexts
3641
def remove_user_context(user_context)
3742
@bidi.send_cmd('browser.removeUserContext', userContext: user_context)
3843
end
39-
end
44+
45+
def windows
46+
response = @bidi.send_cmd('browser.getClientWindows')
47+
48+
response['clientWindows'].map do |win_data|
49+
attributes = {
50+
handle: win_data['clientWindow'],
51+
active: win_data['active'],
52+
height: win_data['height'],
53+
width: win_data['width'],
54+
x: win_data['x'],
55+
y: win_data['y'],
56+
state: win_data['state']
57+
}
58+
Window.new(**attributes)
59+
end
60+
end
61+
end # Browser
4062
end # BiDi
4163
end # WebDriver
4264
end # Selenium

rb/lib/selenium/webdriver/bidi/browsing_context.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def activate(context_id: nil)
109109
context_id ||= @bridge.window_handle
110110
@bidi.send_cmd('browsingContext.activate', context: context_id)
111111
end
112-
end
112+
end # BrowsingContext
113113
end # BiDi
114114
end # WebDriver
115115
end # Selenium

rb/sig/lib/selenium/webdriver/bidi/browser.rbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ module Selenium
22
module WebDriver
33
class BiDi
44
class Browser
5+
Window: Selenium::WebDriver::BiDi::Browser::Window
6+
57
@bidi: BiDi
68

79
def initialize: (BiDi bidi) -> void

rb/spec/integration/selenium/webdriver/action_builder_spec.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ module WebDriver
3838
expect(driver.find_element(id: 'result').text.strip).to be_empty
3939
end
4040

41-
it 'sends keys to element' do
41+
it 'sends keys to element', only: {browser: %i[chrome edge firefox]} do
4242
driver.navigate.to url_for('formPage.html')
4343

4444
input = driver.find_element(css: '#working')
45+
driver.execute_script('arguments[0].scrollIntoView({block: "center", inline: "nearest"});', input)
4546

4647
driver.action.send_keys(input, 'abcd').perform
4748
wait.until { input.property(:value).length == 4 }
@@ -305,9 +306,9 @@ module WebDriver
305306
end
306307
end
307308

308-
describe '#scroll_to', only: {browser: %i[chrome edge firefox]} do
309+
describe '#scroll_to' do
309310
it 'scrolls to element',
310-
except: {browser: :firefox, reason: 'incorrect MoveTargetOutOfBoundsError'} do
311+
exclusive: {browser: %i[chrome edge], reason: 'incorrect MoveTargetOutOfBoundsError'} do
311312
driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html')
312313
iframe = driver.find_element(tag_name: 'iframe')
313314

@@ -321,7 +322,7 @@ module WebDriver
321322

322323
describe '#scroll_by' do
323324
it 'scrolls by given amount',
324-
exclude: {driver: :firefox, reason: 'inconsistent behavior between versions'} do
325+
exclusive: {browser: %i[chrome edge], reason: 'inconsistent behavior between versions'} do
325326
driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html')
326327
footer = driver.find_element(tag_name: 'footer')
327328
delta_y = footer.rect.y.round
@@ -335,7 +336,7 @@ module WebDriver
335336

336337
describe '#scroll_from' do
337338
it 'scrolls from element by given amount',
338-
except: {browser: %i[firefox safari], reason: 'incorrect MoveTargetOutOfBoundsError'} do
339+
exclusive: {browser: %i[chrome edge], reason: 'incorrect MoveTargetOutOfBoundsError in Firefox'} do
339340
driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html')
340341
iframe = driver.find_element(tag_name: 'iframe')
341342
scroll_origin = WheelActions::ScrollOrigin.element(iframe)
@@ -349,7 +350,7 @@ module WebDriver
349350
end
350351

351352
it 'scrolls from element by given amount with offset',
352-
except: {browser: %i[firefox safari], reason: 'incorrect MoveTargetOutOfBoundsError'} do
353+
exclusive: {browser: %i[chrome edge], reason: 'incorrect MoveTargetOutOfBoundsError in Firefox'} do
353354
driver.navigate.to url_for('scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html')
354355
footer = driver.find_element(tag_name: 'footer')
355356
scroll_origin = WheelActions::ScrollOrigin.element(footer, 0, -50)

rb/spec/integration/selenium/webdriver/bidi/browser_spec.rb

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,52 +24,54 @@ module WebDriver
2424
class BiDi
2525
describe Browser, exclusive: {bidi: true, reason: 'only executed when bidi is enabled'},
2626
only: {browser: %i[chrome edge firefox]} do
27+
after { |example| reset_driver!(example: example) }
28+
29+
let(:bidi) { driver.bidi }
30+
2731
it 'creates an user context' do
28-
reset_driver!(web_socket_url: true) do |driver|
29-
browser = described_class.new(driver.bidi)
30-
user_context = browser.create_user_context
31-
expect(user_context).not_to be_nil
32-
expect(user_context['userContext']).to be_a String
33-
end
32+
browser = described_class.new(bidi)
33+
user_context = browser.create_user_context
34+
expect(user_context).not_to be_nil
35+
expect(user_context['userContext']).to be_a String
3436
end
3537

3638
it 'gets user contexts' do
37-
reset_driver!(web_socket_url: true) do |driver|
38-
browser = described_class.new(driver.bidi)
39-
created_context_id = browser.create_user_context['userContext']
40-
all_context_ids = browser.user_contexts['userContexts'].map { |c| c['userContext'] }
39+
browser = described_class.new(bidi)
40+
created_context_id = browser.create_user_context['userContext']
41+
all_context_ids = browser.user_contexts['userContexts'].map { |c| c['userContext'] }
4142

42-
expect(all_context_ids).to include(created_context_id)
43-
end
43+
expect(all_context_ids).to include(created_context_id)
4444
end
4545

4646
it 'removes an user context' do
47-
reset_driver!(web_socket_url: true) do |driver|
48-
browser = described_class.new(driver.bidi)
49-
context_id_to_remove = browser.create_user_context['userContext']
50-
browser.remove_user_context(context_id_to_remove)
51-
all_ids_after_removal = browser.user_contexts['userContexts'].map { |c| c['userContext'] }
47+
browser = described_class.new(bidi)
48+
context_id_to_remove = browser.create_user_context['userContext']
49+
browser.remove_user_context(context_id_to_remove)
50+
all_ids_after_removal = browser.user_contexts['userContexts'].map { |c| c['userContext'] }
5251

53-
expect(all_ids_after_removal).not_to include(context_id_to_remove)
54-
end
52+
expect(all_ids_after_removal).not_to include(context_id_to_remove)
5553
end
5654

5755
it 'throws an error when removing the default user context' do
58-
reset_driver!(web_socket_url: true) do |driver|
59-
browser = described_class.new(driver.bidi)
60-
expect {
61-
browser.remove_user_context('default')
62-
}.to raise_error(Error::WebDriverError, /user context cannot be removed/)
63-
end
56+
browser = described_class.new(bidi)
57+
expect {
58+
browser.remove_user_context('default')
59+
}.to raise_error(Error::WebDriverError, /user context cannot be removed/)
6460
end
6561

6662
it 'throws an error when removing a non-existent user context' do
67-
reset_driver!(web_socket_url: true) do |driver|
68-
browser = described_class.new(driver.bidi)
69-
expect {
70-
browser.remove_user_context('fake_context')
71-
}.to raise_error(Error::WebDriverError)
72-
end
63+
browser = described_class.new(bidi)
64+
expect {
65+
browser.remove_user_context('fake_context')
66+
}.to raise_error(Error::WebDriverError)
67+
end
68+
69+
it 'get windows' do
70+
browser = described_class.new(bidi)
71+
windows = browser.windows
72+
active_window = windows.first
73+
74+
expect(active_window).to be_a(Selenium::WebDriver::BiDi::Browser::Window)
7375
end
7476
end
7577
end

rb/spec/integration/selenium/webdriver/window_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ module WebDriver
102102
expect(new_rect.height).to eq(target_height)
103103
end
104104

105-
it 'can maximize the current window' do
105+
it 'can maximize the current window', except: {browser: :firefox, platform: :macosx} do
106106
window.size = old_size = Dimension.new(700, 700)
107107

108108
window.maximize

0 commit comments

Comments
 (0)