diff --git a/CHANGELOG.md b/CHANGELOG.md index d8c180b..950114d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ ### Changed - Ferrum is bumped to `~> 0.19.0` +- Change `Node#send_keys` to avoid triggering `click` on an already focused element. `send_keys(:tab)` without an + element no longer clicks the middle of the page first, so Tab moves focus from the start of the page, and Capybara's + `#active_element` and `focused:` specs run in the suite [#327] ### Fixed - `window_size: nil` raised `Ferrum::BrowserError: Invalid parameters` on every page instead of leaving the window diff --git a/lib/capybara/cuprite/javascripts/index.js b/lib/capybara/cuprite/javascripts/index.js index 1aef8e6..db9b3bb 100644 --- a/lib/capybara/cuprite/javascripts/index.js +++ b/lib/capybara/cuprite/javascripts/index.js @@ -542,6 +542,10 @@ class Cuprite { window.getSelection().deleteFromDocument(); } + hasFocus(node) { + return document.activeElement === node; + } + containsSelection(node) { let selectedNode = document.getSelection().focusNode; diff --git a/lib/capybara/cuprite/page.rb b/lib/capybara/cuprite/page.rb index 6b4fc00..a053eae 100644 --- a/lib/capybara/cuprite/page.rb +++ b/lib/capybara/cuprite/page.rb @@ -70,7 +70,7 @@ def hover(node) end def send_keys(node, keys) - unless evaluate_on(node: node, expression: %(_cuprite.containsSelection(this))) + unless evaluate_on(node: node, expression: %(_cuprite.containsSelection(this) || _cuprite.hasFocus(this))) before_click(node, "click") node.click(mode: :left, keys: keys) end diff --git a/spec/features/driver_spec.rb b/spec/features/driver_spec.rb index aa3bd48..f6c729e 100644 --- a/spec/features/driver_spec.rb +++ b/spec/features/driver_spec.rb @@ -1450,6 +1450,9 @@ def create_screenshot(file, *args) it "sends keys to the active_element" do @session.find_field("empty_input").execute_script("this.focus()") + @session.find_field("empty_input").execute_script <<~JS + this.addEventListener("click", () => window.clickedBeforeFocus = true) + JS expect(@session).to have_field("empty_input", focused: true) @@ -1457,6 +1460,7 @@ def create_screenshot(file, *args) expect(@session).to have_field("empty_input", focused: false) .and(have_field("filled_input", focused: true)) + expect(@session.evaluate_script("window.clickedBeforeFocus")).to be_nil end it "sends keys to filled contenteditable div" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c5986b5..74f9f6e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -63,7 +63,6 @@ module TestSessions metadata[:skip] = true if metadata[:full_description].match(/#{regexes}/) metadata[:skip] = "Intentionally skipped" if metadata[:full_description].match(/#{intentional_skip}/) - metadata[:skip] = true if metadata[:requires]&.include?(:active_element) end config.around do |example|