diff --git a/lib/capybara/cuprite/browser.rb b/lib/capybara/cuprite/browser.rb index 1615850d..2064ea63 100644 --- a/lib/capybara/cuprite/browser.rb +++ b/lib/capybara/cuprite/browser.rb @@ -30,9 +30,9 @@ def self.start(*args) clear_network_traffic response_headers refresh click right_click double_click hover set click_coordinates drag drag_by select trigger scroll_to send_keys evaluate evaluate_on evaluate_async - execute frame_url frame_title within_frame switch_to_frame - current_url title go_back go_forward find_modal accept_confirm - dismiss_confirm accept_prompt dismiss_prompt reset_modals) => :page + execute frame_url frame_title switch_to_frame current_url title + go_back go_forward find_modal accept_confirm dismiss_confirm + accept_prompt dismiss_prompt reset_modals) => :page attr_reader :process, :logger attr_writer :timeout diff --git a/lib/capybara/cuprite/browser/client.rb b/lib/capybara/cuprite/browser/client.rb index afc5141f..1d47fce3 100644 --- a/lib/capybara/cuprite/browser/client.rb +++ b/lib/capybara/cuprite/browser/client.rb @@ -53,6 +53,9 @@ def subscribe(event, &block) def close @ws.close + # Give a thread some time to handle a tail of messages + Timeout.timeout(1) { @thread.join } + rescue Timeout::Error @thread.kill end diff --git a/lib/capybara/cuprite/browser/dom.rb b/lib/capybara/cuprite/browser/dom.rb index ae38e8e0..d1793e60 100644 --- a/lib/capybara/cuprite/browser/dom.rb +++ b/lib/capybara/cuprite/browser/dom.rb @@ -2,11 +2,11 @@ module Capybara::Cuprite class Browser module DOM def current_url - evaluate_in(@execution_context_id, "location.href") + evaluate_in(execution_context_id, "window.top.location.href") end def title - evaluate_in(@execution_context_id, "document.title") + evaluate_in(execution_context_id, "window.top.document.title") end def body diff --git a/lib/capybara/cuprite/browser/web_socket.rb b/lib/capybara/cuprite/browser/web_socket.rb index 8646636f..5121ee15 100644 --- a/lib/capybara/cuprite/browser/web_socket.rb +++ b/lib/capybara/cuprite/browser/web_socket.rb @@ -2,16 +2,11 @@ require "json" require "socket" -require "forwardable" require "websocket/driver" module Capybara::Cuprite class Browser class WebSocket - extend Forwardable - - delegate close: :@driver - attr_reader :url, :messages def initialize(url, logger) @@ -22,7 +17,9 @@ def initialize(url, logger) @driver = ::WebSocket::Driver.client(self) @messages = Queue.new + @driver.on(:open, &method(:on_open)) @driver.on(:message, &method(:on_message)) + @driver.on(:close, &method(:on_close)) @thread = Thread.new do begin @@ -39,10 +36,8 @@ def initialize(url, logger) @driver.start end - def send_message(data) - json = data.to_json - @driver.text(json) - @logger&.puts("\n\n>>> #{json}") + def on_open(_event) + sleep 0.01 # https://github.com/faye/websocket-driver-ruby/issues/46 end def on_message(event) @@ -51,9 +46,24 @@ def on_message(event) @logger&.puts(" <<< #{event.data}\n") end + def on_close(_event) + @messages.close + @thread.kill + end + + def send_message(data) + json = data.to_json + @driver.text(json) + @logger&.puts("\n\n>>> #{json}") + end + def write(data) @sock.write(data) end + + def close + @driver.close + end end end end diff --git a/lib/capybara/cuprite/driver.rb b/lib/capybara/cuprite/driver.rb index e7e4da31..53c144ad 100644 --- a/lib/capybara/cuprite/driver.rb +++ b/lib/capybara/cuprite/driver.rb @@ -95,10 +95,6 @@ def execute_script(script, *args) nil end - def within_frame(name, &block) - browser.within_frame(name, &block) - end - def switch_to_frame(locator) browser.switch_to_frame(locator) end diff --git a/spec/integration/driver_spec.rb b/spec/integration/driver_spec.rb index 85600204..a3cb0dc3 100644 --- a/spec/integration/driver_spec.rb +++ b/spec/integration/driver_spec.rb @@ -1486,7 +1486,7 @@ def create_screenshot(file, *args) it "can get the frames url" do @session.visit "/cuprite/frames" - @session.within_frame 0 do + @session.within_frame(0) do expect(@session.driver.frame_url).to end_with("/cuprite/slow") if Capybara::VERSION.to_f < 3.0 expect(@session.driver.current_url).to end_with("/cuprite/slow") diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index afcf0e34..e69eff57 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -49,6 +49,7 @@ def set_capybara_wait_time(t) #check when checkbox hidden with Capybara.automatic_label_click == false with allow_label_click == true should not wait the full time if label can be clicked #choose with hidden radio buttons with Capybara.automatic_label_click == true should select self by clicking the label if no locator specified #reset_session! handles already open modals + #scroll_to #click_link can download a file #attach_file with normal form should set a file path by id #attach_file with normal form should set a file path by label @@ -84,13 +85,6 @@ def set_capybara_wait_time(t) Capybara::SpecHelper.configure(config) - config.filter_run_excluding full_description: lambda { |description, _metadata| - [ - # test is marked pending in Capybara but Cuprite passes - disable here - have our own test in driver spec - /Capybara::Session Cuprite node #set should allow me to change the contents of a contenteditable elements child/, - ].any? { |desc| description =~ desc } - } - config.before(:each) do Cuprite::SpecHelper.set_capybara_wait_time(0) end