Skip to content

Commit a622dab

Browse files
committed
[rb] create context manager and implement navigation with BiDi
1 parent 3597ecd commit a622dab

File tree

5 files changed

+120
-30
lines changed

5 files changed

+120
-30
lines changed

rb/lib/selenium/webdriver/bidi.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class BiDi
2424
autoload :LogInspector, 'selenium/webdriver/bidi/log_inspector'
2525
autoload :LogHandler, 'selenium/webdriver/bidi/log_handler'
2626
autoload :BrowsingContext, 'selenium/webdriver/bidi/browsing_context'
27+
autoload :ContextManager, 'selenium/webdriver/bidi/context_manager'
2728
autoload :Struct, 'selenium/webdriver/bidi/struct'
2829

2930
def initialize(url:)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class BrowsingContext
3333
}.freeze
3434

3535
def initialize(driver:, browsing_context_id: nil, type: nil, reference_context: nil)
36+
WebDriver.logger.deprecate('BrowsingContext class',
37+
'ContextManager or driver.navigate',
38+
id: :browsing_context)
39+
3640
unless driver.capabilities.web_socket_url
3741
raise Error::WebDriverError,
3842
'WebDriver instance must support BiDi protocol'
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# frozen_string_literal: true
2+
3+
# Licensed to the Software Freedom Conservancy (SFC) under one
4+
# or more contributor license agreements. See the NOTICE file
5+
# distributed with this work for additional information
6+
# regarding copyright ownership. The SFC licenses this file
7+
# to you under the Apache License, Version 2.0 (the
8+
# "License"); you may not use this file except in compliance
9+
# with the License. You may obtain a copy of the License at
10+
#
11+
# http://www.apache.org/licenses/LICENSE-2.0
12+
#
13+
# Unless required by applicable law or agreed to in writing,
14+
# software distributed under the License is distributed on an
15+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
# KIND, either express or implied. See the License for the
17+
# specific language governing permissions and limitations
18+
# under the License.
19+
20+
require_relative 'navigate_result'
21+
require_relative 'browsing_context_info'
22+
23+
module Selenium
24+
module WebDriver
25+
class BiDi
26+
class ContextManager
27+
READINESS_STATE = {
28+
'none' => 'none',
29+
'eager' => 'interactive',
30+
'normal' => 'complete'
31+
}.freeze
32+
33+
def initialize(bridge)
34+
@bridge = bridge
35+
@bidi = @bridge.bidi
36+
page_load_strategy = bridge.capabilities[:page_load_strategy]
37+
@readiness = READINESS_STATE[page_load_strategy]
38+
end
39+
40+
def navigate(url, context_id: nil)
41+
context_id ||= @bridge.window_handle
42+
puts "READINESS - #{@readiness}"
43+
@bidi.send_cmd('browsingContext.navigate', context: context_id, url: url, wait: @readiness)
44+
end
45+
46+
# Positive values go forwards, negative values go backwards
47+
def traverse_history(delta, context_id: nil)
48+
context_id ||= @bridge.window_handle
49+
@bidi.send_cmd('browsingContext.traverseHistory', context: context_id, delta: delta)
50+
end
51+
52+
def reload(context_id: nil, ignore_cache: false)
53+
context_id ||= @bridge.window_handle
54+
params = {context: context_id, ignore_cache: ignore_cache, wait: @readiness}
55+
@bidi.send_cmd('browsingContext.reload', **params)
56+
end
57+
end
58+
end # BiDi
59+
end # WebDriver
60+
end # Selenium

rb/lib/selenium/webdriver/remote/bidi_bridge.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ def create_session(capabilities)
2929
@bidi = Selenium::WebDriver::BiDi.new(url: socket_url)
3030
end
3131

32+
def get(url)
33+
context_manager.navigate(url)
34+
end
35+
36+
def go_back
37+
context_manager.traverse_history(-1)
38+
end
39+
40+
def go_forward
41+
context_manager.traverse_history(1)
42+
end
43+
44+
def refresh
45+
context_manager.reload
46+
end
47+
3248
def quit
3349
super
3450
ensure
@@ -38,6 +54,12 @@ def quit
3854
def close
3955
execute(:close_window).tap { |handles| bidi.close if handles.empty? }
4056
end
57+
58+
private
59+
60+
def context_manager
61+
@context_manager ||= WebDriver::BiDi::ContextManager.new(self)
62+
end
4163
end # BiDiBridge
4264
end # Remote
4365
end # WebDriver

rb/spec/integration/selenium/webdriver/navigation_spec.rb

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,43 +18,46 @@
1818
# under the License.
1919

2020
require_relative 'spec_helper'
21+
module Selenium
22+
module WebDriver
23+
describe Navigation do
24+
it 'navigates back and forward' do
25+
form_title = 'We Leave From Here'
26+
result_title = 'We Arrive Here'
27+
form_url = url_for 'formPage.html'
28+
result_url = url_for 'resultPage.html'
2129

22-
describe 'Navigation', exclusive: {bidi: false, reason: 'Not yet implemented with BiDi'} do
23-
it 'navigates back and forward' do
24-
form_title = 'We Leave From Here'
25-
result_title = 'We Arrive Here'
26-
form_url = url_for 'formPage.html'
27-
result_url = url_for 'resultPage.html'
30+
driver.navigate.to form_url
31+
expect(driver.title).to eq(form_title)
2832

29-
driver.navigate.to form_url
30-
expect(driver.title).to eq(form_title)
33+
driver.find_element(id: 'imageButton').click
34+
wait.until { driver.title != form_title }
3135

32-
driver.find_element(id: 'imageButton').click
33-
wait.until { driver.title != form_title }
36+
expect(driver.current_url).to include(result_url)
37+
expect(driver.title).to eq(result_title)
3438

35-
expect(driver.current_url).to include(result_url)
36-
expect(driver.title).to eq(result_title)
39+
driver.navigate.back
3740

38-
driver.navigate.back
41+
expect(driver.current_url).to include(form_url)
42+
expect(driver.title).to eq(form_title)
3943

40-
expect(driver.current_url).to include(form_url)
41-
expect(driver.title).to eq(form_title)
44+
driver.navigate.forward
45+
expect(driver.current_url).to include(result_url)
46+
expect(driver.title).to eq(result_title)
47+
end
4248

43-
driver.navigate.forward
44-
expect(driver.current_url).to include(result_url)
45-
expect(driver.title).to eq(result_title)
46-
end
49+
it 'refreshes the page' do
50+
changed_title = 'Changed'
4751

48-
it 'refreshes the page' do
49-
changed_title = 'Changed'
52+
driver.navigate.to url_for('javascriptPage.html')
53+
driver.find_element(link_text: 'Change the page title!').click
54+
expect(driver.title).to eq(changed_title)
5055

51-
driver.navigate.to url_for('javascriptPage.html')
52-
driver.find_element(link_text: 'Change the page title!').click
53-
expect(driver.title).to eq(changed_title)
56+
driver.navigate.refresh
57+
wait.until { driver.title != changed_title }
5458

55-
driver.navigate.refresh
56-
wait.until { driver.title != changed_title }
57-
58-
expect(driver.title).to eq('Testing Javascript')
59-
end
60-
end
59+
expect(driver.title).to eq('Testing Javascript')
60+
end
61+
end
62+
end # WebDriver
63+
end # Selenium

0 commit comments

Comments
 (0)