spec/watirspec/elements/element_spec.rb in watir-7.2.0 vs spec/watirspec/elements/element_spec.rb in watir-7.2.1

- old
+ new

@@ -1,1050 +1,1069 @@ # frozen_string_literal: true require 'watirspec_helper' -describe 'Element' do - before :each do - @c = Selenium::WebDriver::Platform.mac? ? :command : :control - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - end - - describe '.new' do - it "finds elements matching the conditions when given a hash of :how => 'what' arguments" do - expect(browser.checkbox(name: 'new_user_interests', title: 'Dancing is fun!').value).to eq 'dancing' - expect(browser.text_field(class_name: 'name', index: 1).id).to eq 'new_user_last_name' +module Watir + describe Element do + before do + @c = Selenium::WebDriver::Platform.mac? ? :command : :control + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) end - it "raises UnknownObjectException when given a hash of :how => 'what' arguments (non-existing object)" do - expect { browser.text_field(index: 100, name: 'foo').id }.to raise_unknown_object_exception - end + describe '.new' do + it "finds elements matching the conditions when given a hash of :how => 'what' arguments" do + expect(browser.checkbox(name: 'new_user_interests', title: 'Dancing is fun!').value).to eq 'dancing' + expect(browser.text_field(class_name: 'name', index: 1).id).to eq 'new_user_last_name' + end - it 'raises ArgumentError if given the wrong number of arguments' do - container = double('container').as_null_object - expect { Watir::Element.new(container, 1, 2, 3, 4) }.to raise_error(ArgumentError) - expect { Watir::Element.new(container, 'foo') }.to raise_error(ArgumentError) + it "raises UnknownObjectException when given a hash of :how => 'what' arguments (non-existing object)" do + expect { browser.text_field(index: 100, name: 'foo').id }.to raise_unknown_object_exception + end + + it 'raises ArgumentError if given the wrong number of arguments' do + expect { described_class.new(browser.wd, 'foo') }.to raise_error(ArgumentError) + end end - end - describe '#element_call' do - it 'handles exceptions when taking an action on a stale element' do - browser.goto WatirSpec.url_for('removed_element.html') + describe '#element_call' do + it 'handles exceptions when taking an action on a stale element' do + browser.goto WatirSpec.url_for('removed_element.html') - element = browser.div(id: 'text').locate + element = browser.div(id: 'text').locate - browser.refresh + browser.refresh - expect(element).to be_stale - expect { element.text }.to_not raise_error - end + expect(element).to be_stale + expect { element.text }.not_to raise_error + end - it 'relocates stale element when taking an action on it' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - element = browser.text_field(id: 'new_user_first_name').locate - browser.refresh - expect { element.click }.not_to raise_exception + it 'relocates stale element when taking an action on it' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + element = browser.text_field(id: 'new_user_first_name').locate + browser.refresh + expect { element.click }.not_to raise_exception + end end - end - describe '#eq and #eql?' do - before { browser.goto WatirSpec.url_for('definition_lists.html') } + describe '#eq and #eql?' do + before { browser.goto WatirSpec.url_for('definition_lists.html') } - it 'returns true if the two elements point to the same DOM element' do - a = browser.dl(id: 'experience-list') - b = browser.dl + it 'returns true if the two elements point to the same DOM element' do + a = browser.dl(id: 'experience-list') + b = browser.dl - expect(a).to eq b - expect(a).to eql(b) - end + expect(a).to eq b + expect(a).to eql(b) + end - it 'returns false if the two elements are not the same' do - a = browser.dls[0] - b = browser.dls[1] + it 'returns false if the two elements are not the same' do + a = browser.dls[0] + b = browser.dls[1] - expect(a).to_not eq b - expect(a).to_not eql(b) - end + expect(a).not_to eq b + expect(a).not_to eql(b) + end - it 'returns false if the other object is not an Element' do - expect(browser.dl).to_not eq 1 + it 'returns false if the other object is not an Element' do + expect(browser.dl).not_to eq 1 + end end - end - describe 'data-* attributes' do - before { browser.goto WatirSpec.url_for('data_attributes.html') } + describe 'data-* attributes' do + before { browser.goto WatirSpec.url_for('data_attributes.html') } - it 'finds elements by a data-* attribute' do - expect(browser.p(data_type: 'ruby-library')).to exist - end + it 'finds elements by a data-* attribute' do + expect(browser.p(data_type: 'ruby-library')).to exist + end - it 'returns the value of a data-* attribute' do - expect(browser.p.data_type).to eq 'ruby-library' + it 'returns the value of a data-* attribute' do + expect(browser.p.data_type).to eq 'ruby-library' + end end - end - describe 'aria-* attributes' do - before { browser.goto WatirSpec.url_for('aria_attributes.html') } + describe 'aria-* attributes' do + before { browser.goto WatirSpec.url_for('aria_attributes.html') } - it 'finds elements by a aria-* attribute' do - expect(browser.p(aria_label: 'ruby-library')).to exist - end + it 'finds elements by a aria-* attribute' do + expect(browser.p(aria_label: 'ruby-library')).to exist + end - it 'returns the value of a aria-* attribute' do - expect(browser.p.aria_label).to eq 'ruby-library' + it 'returns the value of a aria-* attribute' do + expect(browser.p.aria_label).to eq 'ruby-library' + end end - end - describe 'visible text' do - it 'finds elements by visible text' do - browser.goto WatirSpec.url_for('non_control_elements.html') + describe 'visible text' do + it 'finds elements by visible text' do + browser.goto WatirSpec.url_for('non_control_elements.html') - expect(browser.element(visible_text: 'all visible')).to exist - expect(browser.element(visible_text: /all visible/)).to exist - expect(browser.element(visible_text: /some visible/)).to exist - expect(browser.element(visible_text: 'Link 2', class: 'external')).to exist - expect(browser.element(visible_text: /Link 2/, class: 'external')).to exist - end + expect(browser.element(visible_text: 'all visible')).to exist + expect(browser.element(visible_text: /all visible/)).to exist + expect(browser.element(visible_text: /some visible/)).to exist + expect(browser.element(visible_text: 'Link 2', class: 'external')).to exist + expect(browser.element(visible_text: /Link 2/, class: 'external')).to exist + end - it 'finds elements by visible text in spite of hidden text', - except: {browser: :safari, reason: 'Safari is not filtering out hidden text'} do - browser.goto WatirSpec.url_for('non_control_elements.html') + it 'finds elements by visible text in spite of hidden text', + except: {browser: :safari, reason: 'Safari is not filtering out hidden text'} do + browser.goto WatirSpec.url_for('non_control_elements.html') - expect(browser.element(visible_text: 'some visible')).to exist - expect(browser.element(visible_text: 'none visible')).not_to exist - expect(browser.element(visible_text: /none visible/)).not_to exist - end + expect(browser.element(visible_text: 'some visible')).to exist + expect(browser.element(visible_text: 'none visible')).not_to exist + expect(browser.element(visible_text: /none visible/)).not_to exist + end - it 'raises exception unless value is a String or a RegExp' do - browser.goto WatirSpec.url_for('non_control_elements.html') - msg = /expected one of \[String, Regexp\], got 7:Integer/ - expect { browser.element(visible_text: 7).exists? }.to raise_exception(TypeError, msg) - end + it 'raises exception unless value is a String or a RegExp' do + browser.goto WatirSpec.url_for('non_control_elements.html') + msg = /expected one of \[String, Regexp\], got 7:Integer/ + expect { browser.element(visible_text: 7).exists? }.to raise_exception(TypeError, msg) + end - it 'raises exception unless key is valid' do - browser.goto WatirSpec.url_for('non_control_elements.html') - msg = /Unable to build XPath using 7:Integer/ - expect { browser.element(7 => /foo/).exists? }.to raise_exception(Watir::Exception::Error, msg) + it 'raises exception unless key is valid' do + browser.goto WatirSpec.url_for('non_control_elements.html') + msg = /Unable to build XPath using 7:Integer/ + expect { browser.element(7 => /foo/).exists? }.to raise_exception(Watir::Exception::Error, msg) + end end - end - describe 'finding with unknown tag name' do - it 'finds an element without arguments' do - expect(browser.element).to exist - end + describe 'finding with unknown tag name' do + it 'finds an element without arguments' do + expect(browser.element).to exist + end - it 'finds an element by xpath' do - expect(browser.element(xpath: "//*[@for='new_user_first_name']")).to exist - end + it 'finds an element by xpath' do + expect(browser.element(xpath: "//*[@for='new_user_first_name']")).to exist + end - it 'finds an element by arbitrary attribute' do - expect(browser.element(title: 'no title')).to exist - end + it 'finds an element by arbitrary attribute' do + expect(browser.element(title: 'no title')).to exist + end - it 'finds several elements by xpath' do - expect(browser.elements(xpath: '//a').length).to eq 1 - end + it 'finds several elements by xpath' do + expect(browser.elements(xpath: '//a').length).to eq 1 + end - it 'finds several elements by arbitrary attribute' do - expect(browser.elements(id: /^new_user/).length).to eq 33 - end + it 'finds several elements by arbitrary attribute' do + expect(browser.elements(id: /^new_user/).length).to eq 33 + end - it "finds an element from an element's subtree" do - expect(browser.fieldset.element(id: 'first_label')).to exist - expect(browser.field_set.element(id: 'first_label')).to exist - end + it "finds an element from an element's subtree" do + expect(browser.fieldset.element(id: 'first_label')).to exist + expect(browser.field_set.element(id: 'first_label')).to exist + end - it "finds several elements from an element's subtree" do - expect(browser.fieldset.elements(xpath: './/label').length).to eq 23 + it "finds several elements from an element's subtree" do + expect(browser.fieldset.elements(xpath: './/label').length).to eq 23 + end end - end - describe '#to_subtype' do - it 'returns a CheckBox instance' do - e = browser.input(xpath: "//input[@type='checkbox']").to_subtype - expect(e).to be_kind_of(Watir::CheckBox) - end + describe '#to_subtype' do + it 'returns a CheckBox instance' do + e = browser.input(xpath: "//input[@type='checkbox']").to_subtype + expect(e).to be_a(Watir::CheckBox) + end - it 'returns a Radio instance' do - e = browser.input(xpath: "//input[@type='radio']").to_subtype - expect(e).to be_kind_of(Watir::Radio) - end + it 'returns a Radio instance' do + e = browser.input(xpath: "//input[@type='radio']").to_subtype + expect(e).to be_a(Watir::Radio) + end - it 'returns a Button instance' do - es = [ - browser.input(xpath: "//input[@type='button']").to_subtype, - browser.input(xpath: "//input[@type='submit']").to_subtype, - browser.input(xpath: "//input[@type='reset']").to_subtype, - browser.input(xpath: "//input[@type='image']").to_subtype - ] + it 'returns a Button instance' do + es = [ + browser.input(xpath: "//input[@type='button']").to_subtype, + browser.input(xpath: "//input[@type='submit']").to_subtype, + browser.input(xpath: "//input[@type='reset']").to_subtype, + browser.input(xpath: "//input[@type='image']").to_subtype + ] - es.all? { |e| expect(e).to be_kind_of(Watir::Button) } - end + es.all? { |e| expect(e).to be_a(Watir::Button) } + end - it 'returns a TextField instance' do - e = browser.input(xpath: "//input[@type='text']").to_subtype - expect(e).to be_kind_of(Watir::TextField) - end + it 'returns a TextField instance' do + e = browser.input(xpath: "//input[@type='text']").to_subtype + expect(e).to be_a(Watir::TextField) + end - it 'returns a FileField instance' do - e = browser.input(xpath: "//input[@type='file']").to_subtype - expect(e).to be_kind_of(Watir::FileField) - end + it 'returns a FileField instance' do + e = browser.input(xpath: "//input[@type='file']").to_subtype + expect(e).to be_a(Watir::FileField) + end - it 'returns a Div instance' do - el = browser.element(xpath: "//*[@id='messages']").to_subtype - expect(el).to be_kind_of(Watir::Div) + it 'returns a Div instance' do + el = browser.element(xpath: "//*[@id='messages']").to_subtype + expect(el).to be_a(Watir::Div) + end end - end - describe '#focus' do - it 'fires the onfocus event for the given element' do - tf = browser.text_field(id: 'new_user_occupation') - expect(tf.value).to eq 'Developer' - tf.focus - expect(browser.div(id: 'onfocus_test').text).to eq 'changed by onfocus event' + describe '#focus' do + it 'fires the onfocus event for the given element' do + tf = browser.text_field(id: 'new_user_occupation') + expect(tf.value).to eq 'Developer' + tf.focus + expect(browser.div(id: 'onfocus_test').text).to eq 'changed by onfocus event' + end end - end - describe '#focused?', - except: {browser: :firefox, - driver: :remote_driver, - reason: 'https://github.com/SeleniumHQ/selenium/issues/2555'} do - it 'knows if the element is focused' do - expect(browser.element(id: 'new_user_first_name')).to be_focused - expect(browser.element(id: 'new_user_last_name')).to_not be_focused + describe '#focused?', + except: {browser: :firefox, + driver: :remote_driver, + reason: 'https://github.com/SeleniumHQ/selenium/issues/2555'} do + it 'knows if the element is focused' do + expect(browser.element(id: 'new_user_first_name')).to be_focused + expect(browser.element(id: 'new_user_last_name')).not_to be_focused + end end - end - describe '#fire_event' do - it 'should fire the given event' do - expect(browser.div(id: 'onfocus_test').text).to be_empty - browser.text_field(id: 'new_user_occupation').fire_event('onfocus') - expect(browser.div(id: 'onfocus_test').text).to eq 'changed by onfocus event' + describe '#fire_event' do + it 'fires the given event' do + expect(browser.div(id: 'onfocus_test').text).to be_empty + browser.text_field(id: 'new_user_occupation').fire_event('onfocus') + expect(browser.div(id: 'onfocus_test').text).to eq 'changed by onfocus event' + end end - end - describe '#cache=' do - it 'bypasses selector location' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + describe '#cache=' do + it 'bypasses selector location' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - wd = browser.div.wd - element = Watir::Element.new(browser, id: 'not_valid') - element.cache = wd + wd = browser.div.wd + element = described_class.new(browser, id: 'not_valid') + element.cache = wd - expect(element).to exist - end + expect(element).to exist + end - it 'can be cleared' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + it 'can be cleared' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - wd = browser.div.wd - element = Watir::Element.new(browser, id: 'not_valid') - element.cache = wd + wd = browser.div.wd + element = described_class.new(browser, id: 'not_valid') + element.cache = wd - browser.refresh - expect(element).to_not exist + browser.refresh + expect(element).not_to exist + end end - end - describe '#exists?' do - before do - browser.goto WatirSpec.url_for('removed_element.html') - end + describe '#exists?' do + before do + browser.goto WatirSpec.url_for('removed_element.html') + end - it 'element from a collection is re-looked up after it becomes stale', - except: {browser: :ie, reason: 'throwing NoSuchElement instead'} do - element = browser.divs(id: 'text').first.locate + it 'element from a collection is re-looked up after it becomes stale', + except: {browser: :ie, reason: 'throwing NoSuchElement instead'} do + element = browser.divs(id: 'text').first.locate - browser.refresh + browser.refresh - expect(element).to be_stale - expect(element).to exist - end + expect(element).to be_stale + expect(element).to exist + end - it 'element from a selenium element throws an exception when relocated', - except: {browser: :ie, reason: 'throwing NoSuchElement instead'} do - div = browser.div.locate - element = browser.element(element: div.wd) + it 'element from a selenium element throws an exception when relocated', + except: {browser: :ie, reason: 'throwing NoSuchElement instead'} do + div = browser.div.locate + element = browser.element(element: div.wd) - browser.refresh - expect(element).to be_stale + browser.refresh + expect(element).to be_stale - msg = 'Can not relocate a Watir element initialized by a Selenium element' - expect { element.exists? }.to raise_exception(Watir::Exception::LocatorException, msg) - end + msg = 'Can not relocate a Watir element initialized by a Selenium element' + expect { element.exists? }.to raise_exception(Watir::Exception::LocatorException, msg) + end - it 'element from a selenium element with other locators throws an exception' do - div = browser.div.locate - element = browser.element(element: div.wd, id: 'foo') + it 'element from a selenium element with other locators throws an exception' do + div = browser.div.locate + element = browser.element(element: div.wd, id: 'foo') - browser.refresh + browser.refresh - msg = 'Can not relocate a Watir element initialized by a Selenium element' - expect { element.exists? }.to raise_exception(Watir::Exception::LocatorException, msg) - end + msg = 'Can not relocate a Watir element initialized by a Selenium element' + expect { element.exists? }.to raise_exception(Watir::Exception::LocatorException, msg) + end - it 'returns false when tag name does not match id' do - watir_element = browser.span(id: 'text') - expect(watir_element).to_not exist + it 'returns false when tag name does not match id' do + watir_element = browser.span(id: 'text') + expect(watir_element).not_to exist + end end - end - describe '#present?' do - before do - browser.goto(WatirSpec.url_for('wait.html')) - end + describe '#present?' do + before do + browser.goto(WatirSpec.url_for('wait.html')) + end - it 'returns true if the element exists and is visible' do - expect(browser.div(id: 'foo')).to be_present - end + it 'returns true if the element exists and is visible' do + expect(browser.div(id: 'foo')).to be_present + end - it 'returns false if the element exists but is not visible' do - expect(browser.div(id: 'bar')).to_not be_present - end + it 'returns false if the element exists but is not visible' do + expect(browser.div(id: 'bar')).not_to be_present + end - it 'returns false if the element does not exist' do - expect(browser.div(id: 'should-not-exist')).to_not be_present - end + it 'returns false if the element does not exist' do + expect(browser.div(id: 'should-not-exist')).not_to be_present + end - it 'handles staleness' do - element = browser.div(id: 'foo').locate + it 'handles staleness' do + element = browser.div(id: 'foo').locate - allow(element).to receive(:stale?).and_return(true) + allow(element).to receive(:stale?).and_return(true) - expect(element).to be_present + expect(element).to be_present + end end - end - describe '#enabled?' do - before do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - end + describe '#enabled?' do + before do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + end - it 'returns true if the element is enabled' do - expect(browser.button(name: 'new_user_submit')).to be_enabled - end + it 'returns true if the element is enabled' do + expect(browser.button(name: 'new_user_submit')).to be_enabled + end - it 'returns false if the element is disabled' do - expect(browser.button(name: 'new_user_submit_disabled')).to_not be_enabled - end + it 'returns false if the element is disabled' do + expect(browser.button(name: 'new_user_submit_disabled')).not_to be_enabled + end - it "raises UnknownObjectException if the element doesn't exist" do - expect { browser.button(name: 'no_such_name').enabled? }.to raise_unknown_object_exception + it "raises UnknownObjectException if the element doesn't exist" do + expect { browser.button(name: 'no_such_name').enabled? }.to raise_unknown_object_exception + end end - end - describe '#stale?' do - it 'returns true if the element is stale' do - element = browser.button(name: 'new_user_submit_disabled').locate + describe '#stale?' do + it 'returns true if the element is stale' do + element = browser.button(name: 'new_user_submit_disabled').locate - browser.refresh + browser.refresh - expect(element).to be_stale - end + expect(element).to be_stale + end - it 'returns true the second time if the element is stale', - except: {browser: :ie, reason: 'throwing NoSuchElement instead'} do - element = browser.div.locate + it 'returns true the second time if the element is stale', + except: {browser: :ie, reason: 'throwing NoSuchElement instead'} do + element = browser.div.locate - browser.refresh + browser.refresh - expect(element).to be_stale - expect(element).to be_stale - end - - it 'returns false if the element is not stale' do - element = browser.button(name: 'new_user_submit_disabled').locate - - expect(element).to_not be_stale - end - end - - describe '#exist?' do - context ':class locator' do - before do - browser.goto(WatirSpec.url_for('class_locator.html')) + expect(element).to be_stale + expect(element).to be_stale end - it 'matches when the element has a single class' do - e = browser.div(class: 'a') - expect(e).to exist - expect(e.class_name).to eq 'a' - end + it 'returns false if the element is not stale' do + element = browser.button(name: 'new_user_submit_disabled').locate - it 'matches when the element has several classes' do - e = browser.div(class: 'b') - expect(e).to exist - expect(e.class_name).to eq 'a b c' + expect(element).not_to be_stale end + end - it 'does not match only part of the class name' do - expect(browser.div(class: 'bc')).to_not exist - end + describe '#exist?' do + context 'when using :class locator' do + before do + browser.goto(WatirSpec.url_for('class_locator.html')) + end - it 'matches part of the class name when given a regexp' do - expect(browser.div(class: /c/)).to exist - end - - context 'with multiple classes' do it 'matches when the element has a single class' do - e = browser.div(class: ['a']) + e = browser.div(class: 'a') expect(e).to exist expect(e.class_name).to eq 'a' end - it 'matches a non-ordered subset' do - e = browser.div(class: %w[c a]) + it 'matches when the element has several classes' do + e = browser.div(class: 'b') expect(e).to exist expect(e.class_name).to eq 'a b c' end - it 'matches one with a negation' do - e = browser.div(class: ['!a']) - expect(e).to exist - expect(e.class_name).to eq 'abc' + it 'does not match only part of the class name' do + expect(browser.div(class: 'bc')).not_to exist end - it 'matches multiple with a negation' do - e = browser.div(class: ['a', '!c', 'b']) - expect(e).to exist - expect(e.class_name).to eq 'a b' + it 'matches part of the class name when given a regexp' do + expect(browser.div(class: /c/)).to exist end - it 'matches with any whitespace' do - e = browser.div(class: %w[newline tabbed]) - expect(e).to exist - expect(e.class_name).to eq "first\nnewline\ttabbed last" + context 'with multiple classes' do + it 'matches when the element has a single class' do + e = browser.div(class: ['a']) + expect(e).to exist + expect(e.class_name).to eq 'a' + end + + it 'matches a non-ordered subset' do + e = browser.div(class: %w[c a]) + expect(e).to exist + expect(e.class_name).to eq 'a b c' + end + + it 'matches one with a negation' do + e = browser.div(class: ['!a']) + expect(e).to exist + expect(e.class_name).to eq 'abc' + end + + it 'matches multiple with a negation' do + e = browser.div(class: ['a', '!c', 'b']) + expect(e).to exist + expect(e.class_name).to eq 'a b' + end + + it 'matches with any whitespace' do + e = browser.div(class: %w[newline tabbed]) + expect(e).to exist + expect(e.class_name).to eq "first\nnewline\ttabbed last" + end end end - end - context 'attribute presence' do - before { browser.goto WatirSpec.url_for('data_attributes.html') } + context 'when using attribute presence' do + before { browser.goto WatirSpec.url_for('data_attributes.html') } - it 'finds element by attribute presence' do - expect(browser.p(data_type: true)).to exist - expect(browser.p(class: true)).not_to exist + it 'finds element by attribute presence' do + expect(browser.p(data_type: true)).to exist + expect(browser.p(class: true)).not_to exist + end + + it 'finds element by attribute absence' do + expect(browser.p(data_type: false)).not_to exist + expect(browser.p(class: false)).to exist + end end - it 'finds element by attribute absence' do - expect(browser.p(data_type: false)).not_to exist - expect(browser.p(class: false)).to exist + context 'when using :index locator' do + before { browser.goto WatirSpec.url_for('data_attributes.html') } + + it 'finds the first element by index: 0' do + expect(browser.element(index: 0).tag_name).to eq 'html' + end + + it 'finds the second element by index: 1' do + expect(browser.element(index: 1).tag_name).to eq 'head' + end + + it 'finds the last element by index: -1' do + expect(browser.element(index: -1).tag_name).to eq 'div' + end end - end - context ':index locator' do - before { browser.goto WatirSpec.url_for('data_attributes.html') } + it "doesn't raise when called on nested elements" do + expect(browser.div(id: 'no_such_div').link(id: 'no_such_id')).not_to exist + end - it 'finds the first element by index: 0' do - expect(browser.element(index: 0).tag_name).to eq 'html' + it "doesn't raise when selector has with :xpath has :index" do + expect(browser.div(xpath: '//div', index: 1)).to exist end - it 'finds the second element by index: 1' do - expect(browser.element(index: 1).tag_name).to eq 'head' + it "doesn't raise when selector has with :css has :index" do + expect(browser.div(css: 'div', index: 1)).to exist end - it 'finds the last element by index: -1' do - expect(browser.element(index: -1).tag_name).to eq 'div' + it 'finds element by Selenium name locator' do + expect(browser.element(name: 'new_user_first_name')).to exist + expect(browser.element(name: /new_user_first_name/)).to exist end - end - it "doesn't raise when called on nested elements" do - expect(browser.div(id: 'no_such_div').link(id: 'no_such_id')).to_not exist + it 'returns false when tag name does not match id' do + watir_element = browser.span(id: 'text') + expect(watir_element).not_to exist + end end - it "doesn't raise when selector has with :xpath has :index" do - expect(browser.div(xpath: '//div', index: 1)).to exist - end + describe '#send_keys' do + before do + browser.goto(WatirSpec.url_for('keylogger.html')) + end - it "doesn't raise when selector has with :css has :index" do - expect(browser.div(css: 'div', index: 1)).to exist - end + let(:receiver) { browser.text_field(id: 'receiver') } + let(:events) { browser.element(id: 'output').ps.size } - it 'finds element by Selenium name locator' do - expect(browser.element(name: 'new_user_first_name')).to exist - expect(browser.element(name: /new_user_first_name/)).to exist - end + it 'sends keystrokes to the element' do + receiver.send_keys 'hello world' + expect(receiver.value).to eq 'hello world' + expect(events).to eq 11 + end - it 'returns false when tag name does not match id' do - watir_element = browser.span(id: 'text') - expect(watir_element).to_not exist - end - end + it 'accepts arbitrary list of arguments' do + receiver.send_keys 'hello', 'world' + expect(receiver.value).to eq 'helloworld' + expect(events).to eq 10 + end - describe '#send_keys' do - before(:each) do - browser.goto(WatirSpec.url_for('keylogger.html')) - end + context 'with key combinations', + except: [{browser: :firefox, reason: 'https://github.com/mozilla/geckodriver/issues/245'}, + {browser: :safari}] do + it 'performs from array' do + receiver.send_keys 'foo' + receiver.send_keys [@c, 'a'] + receiver.send_keys :backspace + expect(receiver.value).to be_empty + expect(events).to eq 6 + end - let(:receiver) { browser.text_field(id: 'receiver') } - let(:events) { browser.element(id: 'output').ps.size } + it 'performs from multiple arrays' do + receiver.send_keys 'foo' + receiver.send_keys [@c, 'a'], [@c, 'x'] + expect(receiver.value).to be_empty + expect(events).to eq 7 + end - it 'sends keystrokes to the element' do - receiver.send_keys 'hello world' - expect(receiver.value).to eq 'hello world' - expect(events).to eq 11 + it 'supports combination of strings and arrays' do + receiver.send_keys 'foo', [@c, 'a'], :backspace + expect(receiver.value).to be_empty + expect(events).to eq 6 + end + end end - it 'accepts arbitrary list of arguments' do - receiver.send_keys 'hello', 'world' - expect(receiver.value).to eq 'helloworld' - expect(events).to eq 10 + describe '#click' do + it 'accepts modifiers', except: {browser: :ie} do + browser.a.click(@c) + expect { browser.windows.wait_until(size: 2) }.not_to raise_exception + ensure + browser.windows.restore! + end end - context 'with key combinations', - except: [{browser: :firefox, reason: 'https://github.com/mozilla/geckodriver/issues/245'}, - {browser: :safari}] do - it 'performs from array' do - receiver.send_keys 'foo' - receiver.send_keys [@c, 'a'] - receiver.send_keys :backspace - expect(receiver.value).to be_empty - expect(events).to eq 6 + describe '#set' do + it 'clicks an element by default that does not define #set' do + browser.goto(WatirSpec.url_for('non_control_elements.html')) + browser.element(id: 'best_language').set + expect(browser.div(id: 'best_language').text).to eq 'Ruby!' end - it 'performs from multiple arrays' do - receiver.send_keys 'foo' - receiver.send_keys [@c, 'a'], [@c, 'x'] - expect(receiver.value).to be_empty - expect(events).to eq 7 + it 'clicks an element that does not define #set with provided modifiers', except: {browser: :ie} do + browser.a.set(@c) + browser.wait_until { |b| b.windows.size > 1 } + expect(browser.windows.size).to eq 2 + ensure + browser.windows.restore! end - it 'supports combination of strings and arrays' do - receiver.send_keys 'foo', [@c, 'a'], :backspace - expect(receiver.value).to be_empty - expect(events).to eq 6 + it 'does not click an element that does not define #set when passed false' do + browser.goto(WatirSpec.url_for('non_control_elements.html')) + browser.element(id: 'best_language').set(false) + expect(browser.div(id: 'best_language').text).not_to eq 'Ruby!' end - end - end - describe '#click' do - it 'accepts modifiers', except: {browser: :ie} do - browser.a.click(@c) - expect { browser.windows.wait_until(size: 2) }.to_not raise_exception - ensure - browser.windows.restore! - end - end + it 'clicks a Button' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.button(id: 'delete_user_submit').set + browser.wait_until { |b| !b.url.include? 'forms_with_input_elements.html' } + expect(browser.text).to include('Semantic table') + end - describe '#set' do - it 'clicks an element by default that does not define #set' do - browser.goto(WatirSpec.url_for('non_control_elements.html')) - browser.element(id: 'best_language').set - expect(browser.div(id: 'best_language').text).to eq 'Ruby!' - end + it 'sends keys to text element' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.element(id: 'new_user_email').set('Bye Cruel World') + expect(browser.text_field(id: 'new_user_email').value).to eq 'Bye Cruel World' + end - it 'clicks an element that does not define #set with provided modifiers', except: {browser: :ie} do - browser.a.set(@c) - browser.wait_until { |b| b.windows.size > 1 } - expect(browser.windows.size).to eq 2 - ensure - browser.windows.restore! - end + it 'sends keys to text area' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.element(id: 'delete_user_comment').set('Hello Cruel World') + expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World' + end - it 'does not click an element that does not define #set when passed false' do - browser.goto(WatirSpec.url_for('non_control_elements.html')) - browser.element(id: 'best_language').set(false) - expect(browser.div(id: 'best_language').text).not_to eq 'Ruby!' - end + it 'checks a checkbox' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.element(id: 'new_user_interests_cars').set + expect(browser.checkbox(id: 'new_user_interests_cars')).to be_set + end - it 'clicks a Button' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.button(id: 'delete_user_submit').set - browser.wait_until { |b| !b.url.include? 'forms_with_input_elements.html' } - expect(browser.text).to include('Semantic table') - end + it 'unchecks a checkbox' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.element(id: 'new_user_interests_books').set(false) + expect(browser.checkbox(id: 'new_user_interests_books')).not_to be_set + end - it 'sends keys to text element' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.element(id: 'new_user_email').set('Bye Cruel World') - expect(browser.text_field(id: 'new_user_email').value).to eq 'Bye Cruel World' - end + it 'clicks a Radio' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.radio(id: 'new_user_newsletter_no').set + expect(browser.radio(id: 'new_user_newsletter_no')).to be_set + expect(messages.size).to eq 1 + end - it 'sends keys to text area' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.element(id: 'delete_user_comment').set('Hello Cruel World') - expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World' - end + it 'does not click a Radio when false or already clicked' do + browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) + browser.element(id: 'new_user_newsletter_no').set(false) + browser.element(id: 'new_user_newsletter_yes').set(true) + expect(messages.size).to eq 0 + end - it 'checks a checkbox' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.element(id: 'new_user_interests_cars').set - expect(browser.checkbox(id: 'new_user_interests_cars')).to be_set - end + it 'uploads a file' do + browser.element(name: 'new_user_portrait').set __FILE__ - it 'unchecks a checkbox' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.element(id: 'new_user_interests_books').set(false) - expect(browser.checkbox(id: 'new_user_interests_books')).to_not be_set - end + expect(browser.file_field(name: 'new_user_portrait').value).to include(File.basename(__FILE__)) + end - it 'clicks a Radio' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.radio(id: 'new_user_newsletter_no').set - expect(browser.radio(id: 'new_user_newsletter_no')).to be_set - expect(messages.size).to eq 1 - end + it 'selects an option' do + browser.select_list(name: 'new_user_languages').clear + browser.element(name: 'new_user_languages').set('2') + expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq %w[EN] + end - it 'does not click a Radio when false or already clicked' do - browser.goto(WatirSpec.url_for('forms_with_input_elements.html')) - browser.element(id: 'new_user_newsletter_no').set(false) - browser.element(id: 'new_user_newsletter_yes').set(true) - expect(messages.size).to eq 0 + it 'sends keys to content editable element' do + browser.element(id: 'contenteditable').set('Bar') + expect(browser.div(id: 'contenteditable').text).to eq 'Bar' + end end - it 'uploads a file' do - browser.element(name: 'new_user_portrait').set __FILE__ + describe '#flash' do + let(:h2) { browser.h2(text: 'Add user') } + let(:h1) { browser.h1(text: 'User administration') } - expect(browser.file_field(name: 'new_user_portrait').value).to include(File.basename(__FILE__)) - end + it 'returns the element on which it was called' do + expect(h2.flash).to eq h2 + end - it 'selects an option' do - browser.select_list(name: 'new_user_languages').clear - browser.element(name: 'new_user_languages').set('2') - expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq %w[EN] - end + it 'keeps the element background color after flashing' do + expect(h2.style('background-color')).to eq h2.flash(:rainbow).style('background-color') + expect(h1.style('background-color')).to eq h1.flash.style('background-color') + end - it 'sends keys to content editable element' do - browser.element(id: 'contenteditable').set('Bar') - expect(browser.div(id: 'contenteditable').text).to eq 'Bar' + it 'responds to preset symbols like :fast and :slow' do + expect(h1.flash(:rainbow)).to eq h1 + expect(h2.flash(:slow)).to eq h2 + expect(h1.flash(:fast)).to eq h1 + expect(h2.flash(:long)).to eq h2 + end end - end - describe '#flash' do - let(:h2) { browser.h2(text: 'Add user') } - let(:h1) { browser.h1(text: 'User administration') } + describe '#hover' do + def element_color(element) + case element.style('color') + when 'rgba(0, 0, 255, 1)' + :blue + when 'rgba(255, 165, 0, 1)', 'rgb(255, 165, 0)' + :orange + else + raise rgba + end + end - it 'returns the element on which it was called' do - expect(h2.flash).to eq h2 - end + it 'allows scrolling to top', except: {browser: :ie} do + browser.goto(WatirSpec.url_for('scroll.html')) + element = browser.div(id: 'center') - it 'should keep the element background color after flashing' do - expect(h2.style('background-color')).to eq h2.flash(:rainbow).style('background-color') - expect(h1.style('background-color')).to eq h1.flash.style('background-color') - end + element.hover(scroll_to: :top) + expect(element_color(element)).to eq :orange - it 'should respond to preset symbols like :fast and :slow' do - expect(h1.flash(:rainbow)).to eq h1 - expect(h2.flash(:slow)).to eq h2 - expect(h1.flash(:fast)).to eq h1 - expect(h2.flash(:long)).to eq h2 - end - end - - describe '#hover' do - def element_color(element) - case element.style('color') - when 'rgba(0, 0, 255, 1)' - :blue - when 'rgba(255, 165, 0, 1)', 'rgb(255, 165, 0)' - :orange - else - raise rgba + element_top = browser.execute_script('return arguments[0].getBoundingClientRect().top', element) + expect(element_top).to be_within(1).of(0) end - end - it 'allows scrolling to top', except: {browser: :ie, - reason: 'needs require_window_focus'} do - browser.goto(WatirSpec.url_for('scroll.html')) - element = browser.div(id: 'center') + it 'scrolls to center by default', except: {browser: :ie} do + browser.goto(WatirSpec.url_for('scroll.html')) + element = browser.div(id: 'center') - element.hover(scroll_to: :top) - expect(element_color(element)).to eq :orange + element.hover + expect(element_color(element)).to eq :orange - element_top = browser.execute_script('return arguments[0].getBoundingClientRect().top', element) - expect(element_top).to be_within(1).of(0) - end + element_rect = browser.execute_script('return arguments[0].getBoundingClientRect()', element) - it 'scrolls to center by default', except: {browser: :ie, - reason: 'needs require_window_focus'} do - browser.goto(WatirSpec.url_for('scroll.html')) - element = browser.div(id: 'center') + expect(element_rect['top']).to eq(element_rect['bottom'] - element_rect['height']) + end - element.hover - expect(element_color(element)).to eq :orange + it 'allows scrolling to bottom', except: {browser: :ie} do + browser.goto(WatirSpec.url_for('scroll.html')) + element = browser.div(id: 'center') - element_rect = browser.execute_script('return arguments[0].getBoundingClientRect()', element) + element.hover(scroll_to: :bottom) + expect(element_color(element)).to eq :orange - expect(element_rect['top']).to eq(element_rect['bottom'] - element_rect['height']) - end + element_bottom = browser.execute_script('return arguments[0].getBoundingClientRect().bottom', element) + window_height = browser.execute_script('return window.innerHeight') - it 'allows scrolling to bottom', except: {browser: :ie, - reason: 'needs require_window_focus'} do - browser.goto(WatirSpec.url_for('scroll.html')) - element = browser.div(id: 'center') + expect(element_bottom).to be_within(1).of(window_height) + end - element.hover(scroll_to: :bottom) - expect(element_color(element)).to eq :orange + it 'allows not scrolling', except: {browser: %i[chrome edge], + reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=3955'} do + browser.goto(WatirSpec.url_for('scroll.html')) + element = browser.div(id: 'center') - element_bottom = browser.execute_script('return arguments[0].getBoundingClientRect().bottom', element) - window_height = browser.execute_script('return window.innerHeight') + browser.execute_script('return window.pageYOffset;') + browser.execute_script('return window.innerHeight;') - expect(element_bottom).to be_within(1).of(window_height) + expect { + element.hover(scroll_to: nil) + }.to raise_exception Selenium::WebDriver::Error::MoveTargetOutOfBoundsError + end end - it 'allows not scrolling', except: {browser: %i[chrome edge], - reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=3955'} do - browser.goto(WatirSpec.url_for('scroll.html')) - element = browser.div(id: 'center') + describe '#inspect' do + before { browser.goto(WatirSpec.url_for('nested_iframes.html')) } - browser.execute_script('return window.pageYOffset;') - browser.execute_script('return window.innerHeight;') + it 'does displays specified element type' do + expect(browser.div.inspect).to include('Watir::Div') + end - expect { element.hover(scroll_to: nil) }.to raise_exception Selenium::WebDriver::Error::MoveTargetOutOfBoundsError - end - end + it 'does not display element type if not specified' do + element = browser.element(index: 4) + expect(element.inspect).to include('Watir::HTMLElement') + end - describe '#inspect' do - before(:each) { browser.goto(WatirSpec.url_for('nested_iframes.html')) } + it 'displays keyword if specified' do + element = browser.h3 + element.keyword = 'foo' + expect(element.inspect).to include('keyword: foo') + end - it 'does displays specified element type' do - expect(browser.div.inspect).to include('Watir::Div') - end + it 'does not display keyword if not specified' do + element = browser.h3 + expect(element.inspect).not_to include('keyword') + end - it 'does not display element type if not specified' do - element = browser.element(index: 4) - expect(element.inspect).to include('Watir::HTMLElement') - end + it 'locate is false when not located' do + element = browser.div(id: 'not_present') + expect(element.inspect).to include('located: false') + end - it 'displays keyword if specified' do - element = browser.h3 - element.keyword = 'foo' - expect(element.inspect).to include('keyword: foo') - end + it 'locate is true when located' do + element = browser.h3 + element.exists? + expect(element.inspect).to include('located: true') + end - it 'does not display keyword if not specified' do - element = browser.h3 - expect(element.inspect).to_not include('keyword') - end + it 'displays selector string for element from colection' do + elements = browser.frames + expect(elements.last.inspect).to include '{:tag_name=>"frame", :index=>-1}' + end - it 'locate is false when not located' do - element = browser.div(id: 'not_present') - expect(element.inspect).to include('located: false') - end + it 'displays selector string for nested element' do + browser.goto(WatirSpec.url_for('wait.html')) + element = browser.div(index: 1).div(id: 'div2') + expect(element.inspect).to include '{:index=>1, :tag_name=>"div"} --> {:id=>"div2", :tag_name=>"div"}' + end - it 'locate is true when located' do - element = browser.h3 - element.exists? - expect(element.inspect).to include('located: true') + it 'displays selector string for nested element under frame' do + element = browser.iframe(id: 'one').iframe(id: 'three') + expect(element.inspect).to include '{:id=>"one", :tag_name=>"iframe"} --> {:id=>"three", :tag_name=>"iframe"}' + end end - it 'displays selector string for element from colection' do - elements = browser.frames - expect(elements.last.inspect).to include '{:tag_name=>"frame", :index=>-1}' + describe '#text_content' do + it 'returns inner Text code of element' do + browser.goto WatirSpec.url_for('non_control_elements.html') + expect(browser.div(id: 'shown').text_content).to eq('Not shownNot hidden') + end end - it 'displays selector string for nested element' do - browser.goto(WatirSpec.url_for('wait.html')) - element = browser.div(index: 1).div(id: 'div2') - expect(element.inspect).to include '{:index=>1, :tag_name=>"div"} --> {:id=>"div2", :tag_name=>"div"}' + describe '#inner_text' do + it 'returns inner HTML code of element', + except: {browser: :ie, reason: 'also returning explicitly hidden results'} do + browser.goto WatirSpec.url_for('non_control_elements.html') + div = browser.div(id: 'shown') + expect(div.inner_text).to eq('Not hidden') + end end - it 'displays selector string for nested element under frame' do - element = browser.iframe(id: 'one').iframe(id: 'three') - expect(element.inspect).to include '{:id=>"one", :tag_name=>"iframe"} --> {:id=>"three", :tag_name=>"iframe"}' + describe '#inner_html' do + it 'returns inner HTML code of element' do + browser.goto WatirSpec.url_for('non_control_elements.html') + div = browser.div(id: 'shown') + expected_text = '<div id="hidden" style="display: none;">Not shown</div><div>Not hidden</div>' + expect(div.inner_html).to eq expected_text + end end - end - describe '#text_content' do - it 'returns inner Text code of element' do - browser.goto WatirSpec.url_for('non_control_elements.html') - expect(browser.div(id: 'shown').text_content).to eq('Not shownNot hidden') + describe '#outer_html' do + it 'returns outer (inner + element itself) HTML code of element' do + browser.goto WatirSpec.url_for('non_control_elements.html') + div = browser.div(id: 'shown') + text = '<div id="shown"><div id="hidden" style="display: none;">Not shown</div><div>Not hidden</div></div>' + expect(div.outer_html).to eq text + end end - end - describe '#inner_text' do - it 'returns inner HTML code of element', - except: {browser: :ie, reason: 'also returning explicitly hidden results'} do - browser.goto WatirSpec.url_for('non_control_elements.html') - div = browser.div(id: 'shown') - expect(div.inner_text).to eq('Not hidden') + describe '#select_text and #selected_text' do + it 'selects text and returns selected text', + except: {browser: :ie, reason: 'Select Text atom appears broken in IE 11'} do + browser.goto WatirSpec.url_for('non_control_elements.html') + element = browser.element(visible_text: 'all visible') + element.select_text('all visible') + expect(element.selected_text).to eq 'all visible' + end end - end - describe '#inner_html' do - it 'returns inner HTML code of element' do - browser.goto WatirSpec.url_for('non_control_elements.html') - div = browser.div(id: 'shown') - expected_text = '<div id="hidden" style="display: none;">Not shown</div><div>Not hidden</div>' - expect(div.inner_html).to eq expected_text - end - end + describe '#location' do + it 'returns coordinates for element location' do + location = browser.button(name: 'new_user_image').location - describe '#outer_html' do - it 'returns outer (inner + element itself) HTML code of element' do - browser.goto WatirSpec.url_for('non_control_elements.html') - div = browser.div(id: 'shown') - text = '<div id="shown"><div id="hidden" style="display: none;">Not shown</div><div>Not hidden</div></div>' - expect(div.outer_html).to eq text + expect(location).to be_a Selenium::WebDriver::Point + expect(location['y']).to be > 0 + expect(location['x']).to be > 0 + end end - end - describe '#select_text and #selected_text' do - it 'selects text and returns selected text', - except: {browser: :ie, reason: 'Select Text atom appears broken in IE 11'} do - browser.goto WatirSpec.url_for('non_control_elements.html') - element = browser.element(visible_text: 'all visible') - element.select_text('all visible') - expect(element.selected_text).to eq 'all visible' - end - end + describe '#size' do + it 'returns size of element' do + size = browser.button(name: 'new_user_image').size + expect(size).to be_a Selenium::WebDriver::Dimension - describe '#location' do - it 'returns coordinates for element location' do - location = browser.button(name: 'new_user_image').location + expected_width = browser.name == :safari ? 105 : 104 + expected_height = browser.name == :safari ? 71 : 70 - expect(location).to be_a Selenium::WebDriver::Point - expect(location['y']).to be > 0 - expect(location['x']).to be > 0 + expect(size['width']).to eq expected_width + expect(size['height']).to eq expected_height + end end - end - describe '#size' do - it 'returns size of element' do - size = browser.button(name: 'new_user_image').size - expect(size).to be_a Selenium::WebDriver::Dimension + describe '#height' do + it 'returns height of element' do + height = browser.button(name: 'new_user_image').height - expected_width = browser.name == :safari ? 105 : 104 - expected_height = browser.name == :safari ? 71 : 70 - - expect(size['width']).to eq expected_width - expect(size['height']).to eq expected_height + expected_height = browser.name == :safari ? 71 : 70 + expect(height).to eq expected_height + end end - end - describe '#height' do - it 'returns height of element' do - height = browser.button(name: 'new_user_image').height + describe '#width' do + it 'returns width of element' do + width = browser.button(name: 'new_user_image').width - expected_height = browser.name == :safari ? 71 : 70 - expect(height).to eq expected_height + expected_width = browser.name == :safari ? 105 : 104 + expect(width).to eq expected_width + end end - end - describe '#width' do - it 'returns width of element' do - width = browser.button(name: 'new_user_image').width + describe '#center' do + it 'returns center of element' do + center = browser.button(name: 'new_user_image').center - expected_width = browser.name == :safari ? 105 : 104 - expect(width).to eq expected_width + expect(center).to be_a Selenium::WebDriver::Point + expect(center['y']).to be > 0.0 + expect(center['x']).to be > 0.0 + end end - end - describe '#center' do - it 'returns center of element' do - center = browser.button(name: 'new_user_image').center + describe '#attribute_value' do + before { browser.goto WatirSpec.url_for('data_attributes.html') } - expect(center).to be_a Selenium::WebDriver::Point - expect(center['y']).to be > 0.0 - expect(center['x']).to be > 0.0 + it 'returns attribute value by string attribute name' do + expect(browser.p.attribute_value('data-type')).to eq 'ruby-library' + end + + it 'returns attribute value by symbol attribute name' do + expect(browser.p.attribute_value(:data_type)).to eq 'ruby-library' + end end - end - describe '#attribute_value' do - before { browser.goto WatirSpec.url_for('data_attributes.html') } + describe '#attribute_values' do + before { browser.goto WatirSpec.url_for('data_attributes.html') } - it 'returns attribute value by string attribute name' do - expect(browser.p.attribute_value('data-type')).to eq 'ruby-library' - end + it 'returns a Hash object' do + expect(browser.p.attribute_values).to be_an_instance_of(Hash) + end - it 'returns attribute value by symbol attribute name' do - expect(browser.p.attribute_value(:data_type)).to eq 'ruby-library' - end - end + it 'returns attribute values from an element' do + expected = {data_type: 'ruby-library'} + expect(browser.p.attribute_values).to eq expected + end - describe '#attribute_values' do - before { browser.goto WatirSpec.url_for('data_attributes.html') } + it 'returns attribute with special characters' do + expected = {data_type: 'description', 'data-type_$p3c!a1' => 'special-description'} + expect(browser.div.attribute_values).to eq expected + end - it 'returns a Hash object' do - expect(browser.p.attribute_values).to be_an_instance_of(Hash) + it 'returns attribute with special characters as a String' do + expect(browser.div.attribute_values.keys[0]).to be_an_instance_of(String) + end end - it 'returns attribute values from an element' do - expected = {data_type: 'ruby-library'} - expect(browser.p.attribute_values).to eq expected - end + describe '#attribute_list' do + before { browser.goto WatirSpec.url_for('data_attributes.html') } - it 'returns attribute with special characters' do - expected = {data_type: 'description', 'data-type_$p3c!a1' => 'special-description'} - expect(browser.div.attribute_values).to eq expected - end + it 'returns an Array object' do + expect(browser.div.attribute_list).to be_an_instance_of(Array) + end - it 'returns attribute with special characters as a String' do - expect(browser.div.attribute_values.keys[0]).to be_an_instance_of(String) + it 'returns list of attributes from an element' do + expect(browser.p.attribute_list).to eq [:data_type] + end + + it 'returns attribute name with special characters as a String' do + expect(browser.div.attribute_list[0]).to be_an_instance_of(String) + end end - end - describe '#attribute_list' do - before { browser.goto WatirSpec.url_for('data_attributes.html') } + describe '#located?' do + it 'returns true if element has been located' do + expect(browser.form(id: 'new_user')).not_to be_located + end - it 'returns an Array object' do - expect(browser.div.attribute_list).to be_an_instance_of(Array) + it 'returns false if element has not been located' do + expect(browser.form(id: 'new_user').locate).to be_located + end end - it 'returns list of attributes from an element' do - expect(browser.p.attribute_list).to eq [:data_type] + describe '#wd' do + it 'returns a Selenium::WebDriver::Element instance' do + element = browser.text_field(id: 'new_user_email') + expect(element.wd).to be_a(Selenium::WebDriver::Element) + end end - it 'returns attribute name with special characters as a String' do - expect(browser.div.attribute_list[0]).to be_an_instance_of(String) + describe '#hash' do + it 'returns a hash' do + element = browser.text_field(id: 'new_user_email') + hash1 = element.hash + hash2 = element.locate.hash + expect(hash1).to be_a Integer + expect(hash2).to be_a Integer + expect(hash1).not_to eq hash2 + end end - end - describe '#located?' do - it 'returns true if element has been located' do - expect(browser.form(id: 'new_user')).to_not be_located - end + describe 'Numeric Attribute' do + it 'returns Float value', + except: {browser: :ie, reason: 'not recognizing the value of the element'} do + element = browser.text_field(id: 'number') + expect(element.valueasnumber).to be_a Float + end - it 'returns false if element has not been located' do - expect(browser.form(id: 'new_user').locate).to be_located - end - end + it 'returns nil for unspecified value' do + element = browser.input + expect(element.valueasnumber).to be_nil + end - describe '#wd' do - it 'returns a Selenium::WebDriver::Element instance' do - element = browser.text_field(id: 'new_user_email') - expect(element.wd).to be_a(Selenium::WebDriver::Element) + it 'returns Integer value' do + element = browser.form + expect(element.length).to be_a Integer + end end - end - describe '#hash' do - it 'returns a hash' do - element = browser.text_field(id: 'new_user_email') - hash1 = element.hash - hash2 = element.locate.hash - expect(hash1).to be_a Integer - expect(hash2).to be_a Integer - expect(hash1).to_not eq hash2 - end - end + describe 'Special Characters' do + before do + browser.goto WatirSpec.url_for('special_chars.html') + end - describe 'Numeric Attribute' do - it 'returns Float value', - except: {browser: :ie, reason: 'not recognizing the value of the element'} do - element = browser.text_field(id: 'number') - expect(element.valueasnumber).to be_a Float - end + it 'finds elements with single quotes' do + expect(browser.div(text: "single 'quotes'")).to exist + end - it 'returns nil for unspecified value' do - element = browser.input - expect(element.valueasnumber).to be_nil - end + it 'finds elements with non-standard character locators' do + expect(browser.div('we{ird' => 'foo')).to exist + expect(browser.div('we{ird': 'foo')).to exist + end - it 'returns Integer value' do - element = browser.form - expect(element.length).to be_a Integer + it 'finds element with underscored attribute' do + expect(browser.div('underscored_attribute' => 'true')).to exist + expect(browser.div('underscored_attribute' => true)).to exist + end end - end - describe '#class_name' do - it 'returns single class name' do - expect(browser.form(id: 'new_user').class_name).to eq 'user' - end + describe '#class_name' do + it 'returns single class name' do + expect(browser.form(id: 'new_user').class_name).to eq 'user' + end - it 'returns multiple class names in a String' do - expect(browser.div(id: 'messages').class_name).to eq 'multiple classes here' - end + it 'returns multiple class names in a String' do + expect(browser.div(id: 'messages').class_name).to eq 'multiple classes here' + end - it 'returns an empty string if the element exists but there is no class attribute' do - expect(browser.div(id: 'changed_language').class_name).to eq '' - end + it 'returns an empty string if the element exists but there is no class attribute' do + expect(browser.div(id: 'changed_language').class_name).to eq '' + end - it 'raises UnknownObjectException if the element does not exist' do - expect { browser.div(id: 'no_such_id').class_name }.to raise_unknown_object_exception + it 'raises UnknownObjectException if the element does not exist' do + expect { browser.div(id: 'no_such_id').class_name }.to raise_unknown_object_exception + end end - end - describe '#classes' do - it 'returns the class attribute if the element exists' do - expect(browser.div(id: 'messages').classes).to eq %w[multiple classes here] - end + describe '#classes' do + it 'returns the class attribute if the element exists' do + expect(browser.div(id: 'messages').classes).to eq %w[multiple classes here] + end - it 'returns an empty array if the element exists but there is no class attribute' do - expect(browser.div(id: 'changed_language').classes).to eq [] - end + it 'returns an empty array if the element exists but there is no class attribute' do + expect(browser.div(id: 'changed_language').classes).to eq [] + end - it 'raises UnknownObjectException if the element does not exist' do - expect { browser.div(id: 'no_such_id').classes }.to raise_unknown_object_exception + it 'raises UnknownObjectException if the element does not exist' do + expect { browser.div(id: 'no_such_id').classes }.to raise_unknown_object_exception + end end - end - describe '#obscured?' do - before { browser.goto WatirSpec.url_for('obscured.html') } + describe '#obscured?' do + before { browser.goto WatirSpec.url_for('obscured.html') } - it 'returns false if element center is not covered' do - btn = browser.button(id: 'not_obscured') - btn.scroll.to :center - expect { btn.click }.not_to raise_exception - expect(btn).not_to be_obscured - end + it 'returns false if element center is not covered' do + btn = browser.button(id: 'not_obscured') + btn.scroll.to :center + expect { btn.click }.not_to raise_exception + expect(btn).not_to be_obscured + end - it 'returns false if element center is covered by its descendant' do - btn = browser.button(id: 'has_descendant') - btn.scroll.to :center - expect { btn.click }.not_to raise_exception - expect(btn).not_to be_obscured - end + it 'returns false if element center is covered by its descendant' do + btn = browser.button(id: 'has_descendant') + btn.scroll.to :center + expect { btn.click }.not_to raise_exception + expect(btn).not_to be_obscured + end - it 'returns true if element center is covered by a non-descendant', - except: {browser: :safari, reason: 'not getting element click intercepted'} do - btn = browser.button(id: 'obscured') - btn.scroll.to :center - expect { btn.click }.to raise_exception(Selenium::WebDriver::Error::ElementClickInterceptedError) - expect(btn).to be_obscured - end + it 'returns true if element center is covered by a non-descendant', + except: {browser: :safari, reason: 'not getting element click intercepted'} do + btn = browser.button(id: 'obscured') + btn.scroll.to :center + expect { btn.click }.to raise_exception(Selenium::WebDriver::Error::ElementClickInterceptedError) + expect(btn).to be_obscured + end - it 'returns false if element center is surrounded by non-descendants' do - btn = browser.button(id: 'surrounded') - btn.scroll.to :center - expect { btn.click }.not_to raise_exception - expect(btn).not_to be_obscured - end + it 'returns false if element center is surrounded by non-descendants' do + btn = browser.button(id: 'surrounded') + btn.scroll.to :center + expect { btn.click }.not_to raise_exception + expect(btn).not_to be_obscured + end - it 'correctly scrolls element below viewport' do - browser.goto WatirSpec.url_for('sticky_elements.html') + it 'correctly scrolls element below viewport' do + browser.goto WatirSpec.url_for('sticky_elements.html') - element = browser.div(id: 'center') + element = browser.div(id: 'center') - browser.scroll.to :top - expect { element.click }.not_to raise_exception + browser.scroll.to :top + expect { element.click }.not_to raise_exception - browser.scroll.to :top - expect(element).not_to be_obscured - end + browser.scroll.to :top + expect(element).not_to be_obscured + end - it 'correctly scrolls element above viewport', - except: {browser: %i[chrome edge], - reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=3954'} do - browser.goto WatirSpec.url_for('sticky_elements.html') - element = browser.div(id: 'center') + it 'correctly scrolls element above viewport', + except: {browser: %i[chrome edge], + reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=3954'} do + browser.goto WatirSpec.url_for('sticky_elements.html') + element = browser.div(id: 'center') - browser.scroll.to :bottom - expect { element.click }.not_to raise_exception + browser.scroll.to :bottom + expect { element.click }.not_to raise_exception - browser.scroll.to :bottom - expect(element).not_to be_obscured - end + browser.scroll.to :bottom + expect(element).not_to be_obscured + end - it 'scrolls non-interactive element into view before checking if obscured' do - div = browser.div(id: 'requires_scrolling_container') - expect { div.click }.not_to raise_exception - browser.scroll.to :top - expect(div).not_to be_obscured - end + it 'scrolls non-interactive element into view before checking if obscured' do + div = browser.div(id: 'requires_scrolling_container') + expect { div.click }.not_to raise_exception + browser.scroll.to :top + expect(div).not_to be_obscured + end - it 'returns true if element cannot be scrolled into view' do - btn = browser.button(id: 'off_screen') - expect(btn).to be_obscured - expect { btn.click }.to raise_unknown_object_exception - end + it 'returns true if element cannot be scrolled into view' do + btn = browser.button(id: 'off_screen') + expect(btn).to be_obscured + expect { btn.click }.to raise_unknown_object_exception + end - it 'returns true if element is hidden' do - btn = browser.button(id: 'hidden') - expect(btn).to be_obscured - expect { btn.click }.to raise_unknown_object_exception - end + it 'returns true if element is hidden' do + btn = browser.button(id: 'hidden') + expect(btn).to be_obscured + expect { btn.click }.to raise_unknown_object_exception + end - it 'raises UnknownObjectException if element does not exist' do - expect { browser.button(id: 'does_not_exist').obscured? }.to raise_unknown_object_exception + it 'raises UnknownObjectException if element does not exist' do + expect { browser.button(id: 'does_not_exist').obscured? }.to raise_unknown_object_exception + end end end end