spec/watirspec/elements/element_spec.rb in watir-6.10.1 vs spec/watirspec/elements/element_spec.rb in watir-6.10.2
- old
+ new
@@ -1,483 +1,483 @@
-require "watirspec_helper"
-
-describe "Element" do
-
- before :each do
- 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'
- end
-
- it "raises UnknownObjectException with a sane error message 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
- 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)
- end
- end
-
- 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
-
- 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]
-
- expect(a).to_not eq b
- expect(a).to_not eql(b)
- end
-
- it "returns false if the other object is not an Element" do
- expect(browser.dl).to_not eq 1
- end
- end
-
- 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 "returns the value of a data-* attribute" do
- expect(browser.p.data_type).to eq "ruby-library"
- end
- end
-
- 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 "returns the value of a aria-* attribute" do
- expect(browser.p.aria_label).to eq "ruby-library"
- end
- end
-
- describe "visible text" do
- it "finds elements by visible text" do
- browser.goto WatirSpec.url_for('non_control_elements.html')
-
- expect(browser.link(visible_text: "all visible")).to exist
- expect(browser.link(visible_text: /all visible/)).to exist
- expect(browser.link(visible_text: "some visible")).to exist
- expect(browser.link(visible_text: /some visible/)).to exist
- expect(browser.link(visible_text: "none visible")).not_to exist
- expect(browser.link(visible_text: /none visible/)).not_to exist
-
- expect(browser.link(visible_text: "Link 2", class: "external")).to exist
- expect(browser.link(visible_text: /Link 2/, class: "external")).to exist
-
- 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: /some visible/)).to exist
- end
- 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 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 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 several elements from an element's subtree" do
- expect(browser.fieldset.elements(xpath: ".//label").length).to eq 21
- 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
-
- 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 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
-
- 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 FileField instance" do
- e = browser.input(xpath: "//input[@type='file']").to_subtype
- expect(e).to be_kind_of(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)
- 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"
- end
- end
-
- bug "https://github.com/SeleniumHQ/selenium/issues/2555", %i(remote firefox) do
- bug "https://github.com/SeleniumHQ/selenium/issues/1795", %i(remote edge) do
- describe "#focused?" 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
- end
- 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"
- end
- end
-
- describe "#visible?" do
- it "returns true if the element is visible" do
- expect(browser.text_field(id: "new_user_email")).to be_visible
- end
-
- it "raises UnknownObjectException exception if the element does not exist" do
- expect { browser.text_field(id: "no_such_id").visible? }.to raise_unknown_object_exception
- end
-
- it "raises UnknownObjectException exception if the element is stale" do
- wd_element = browser.text_field(id: "new_user_email").wd
-
- # simulate element going stale during lookup
- allow(browser.driver).to receive(:find_element).with(:css, '#new_user_email') { wd_element }
- allow(browser.driver).to receive(:find_elements).with(:css, '#new_user_email') { [wd_element] }
- allow(browser.driver).to receive(:find_elements).with(:tag_name, 'iframe') { [] }
- browser.refresh
-
- expect { browser.text_field(css: '#new_user_email').visible? }.to raise_unknown_object_exception
- end
-
- it "returns true if the element has style='visibility: visible' even if parent has style='visibility: hidden'" do
- expect(browser.div(id: "visible_child")).to be_visible
- end
-
- it "returns false if the element is input element where type eq 'hidden'" do
- expect(browser.hidden(id: "new_user_interests_dolls")).to_not be_visible
- end
-
- it "returns false if the element has style='display: none;'" do
- expect(browser.div(id: 'changed_language')).to_not be_visible
- end
-
- it "returns false if the element has style='visibility: hidden;" do
- expect(browser.div(id: 'wants_newsletter')).to_not be_visible
- end
-
- it "returns false if one of the parent elements is hidden" do
- expect(browser.div(id: 'hidden_parent')).to_not be_visible
- end
- end
-
- describe "#exist?" do
- context ":class locator" do
- before do
- browser.goto(WatirSpec.url_for("class_locator.html"))
- 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 "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 "does not match only part of the class name" do
- expect(browser.div(class: "bc")).to_not exist
- 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"])
- expect(e).to exist
- expect(e.class_name).to eq "a"
- end
-
- it "matches a non-ordered subset" do
- e = browser.div(class: ["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
- end
- end
-
- context "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
- 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 "doesn't raise when called on nested elements" do
- expect(browser.div(id: 'no_such_div').link(id: 'no_such_id')).to_not exist
- end
-
- it "raises if both :xpath and :css are given" do
- expect { browser.div(xpath: "//div", css: "div").exists? }.to raise_error(ArgumentError)
- end
-
- it "doesn't raise when selector has with :xpath has :index" do
- expect(browser.div(xpath: "//div", index: 1)).to exist
- end
-
- it "raises ArgumentError error if selector hash with :xpath has multiple entries" do
- expect { browser.div(xpath: "//div", class: "foo").exists? }.to raise_error(ArgumentError)
- end
-
- it "doesn't raise when selector has with :css has :index" do
- expect(browser.div(css: "div", index: 1)).to exist
- end
-
- it "raises ArgumentError error if selector hash with :css has multiple entries" do
- expect { browser.div(css: "div", class: "foo").exists? }.to raise_error(ArgumentError)
- end
-
- 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
-
- describe '#send_keys' do
- before(:each) do
- @c = Selenium::WebDriver::Platform.mac? ? :command : :control
- browser.goto(WatirSpec.url_for('keylogger.html'))
- end
-
- let(:receiver) { browser.text_field(id: 'receiver') }
- let(:events) { browser.element(id: 'output').ps.size }
-
- 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 'accepts arbitrary list of arguments' do
- receiver.send_keys 'hello', 'world'
- expect(receiver.value).to eq 'helloworld'
- expect(events).to eq 10
- end
-
- bug "http://code.google.com/p/chromium/issues/detail?id=93879", :chrome do
- not_compliant_on :safari, :firefox do
- it 'performs key combinations' 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
-
- it 'performs arbitrary list of key combinations' 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 '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
- end
-
- describe "#flash" do
-
- let(:h2) { browser.h2(text: 'Add user') }
-
- it 'returns the element on which it was called' do
- expect(h2.flash).to eq h2
- 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')
- end
- end
-
- describe '#inner_text' do
- it 'returns inner HTML code of element' 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
-
- 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 '#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')
- expected_text = "<div id=\"shown\"><div id=\"hidden\" style=\"display: none;\">Not shown</div><div>Not hidden</div></div>"
- expect(div.outer_html).to eq expected_text
- end
- end
-
- not_compliant_on %i(remote firefox) do
- describe '#scroll_into_view' do
- it 'scrolls element into view' do
- el = browser.button(name: 'new_user_image')
- element_center = el.center['y']
-
- bottom_viewport_script = 'return window.pageYOffset + window.innerHeight'
- expect(browser.execute_script bottom_viewport_script).to be < element_center
-
- expect(el.scroll_into_view).to be_a Selenium::WebDriver::Point
-
- expect(browser.execute_script bottom_viewport_script).to be > element_center
- end
- end
- end
-
- describe '#location' do
- it 'returns coordinates for element location' do
- location = browser.button(name: 'new_user_image').location
-
- expect(location).to be_a Selenium::WebDriver::Point
- expect(location['y']).to be > 0
- expect(location['x']).to be > 0
- 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
- expect(size['width']).to eq 104.0
- expect(size['height']).to eq 70.0
- end
- end
-
- describe '#height' do
- it 'returns height of element' do
- height = browser.button(name: 'new_user_image').height
-
- expect(height).to eq 70.0
- end
- end
-
- describe '#width' do
- it 'returns width of element' do
- width = browser.button(name: 'new_user_image').width
-
- expect(width).to eq 104.0
- end
-
- end
-
- describe '#center' do
- it 'returns center of element' do
- center = browser.button(name: 'new_user_image').center
-
- 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
+require "watirspec_helper"
+
+describe "Element" do
+
+ before :each do
+ 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'
+ end
+
+ it "raises UnknownObjectException with a sane error message 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
+ 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)
+ end
+ end
+
+ 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
+
+ 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]
+
+ expect(a).to_not eq b
+ expect(a).to_not eql(b)
+ end
+
+ it "returns false if the other object is not an Element" do
+ expect(browser.dl).to_not eq 1
+ end
+ end
+
+ 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 "returns the value of a data-* attribute" do
+ expect(browser.p.data_type).to eq "ruby-library"
+ end
+ end
+
+ 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 "returns the value of a aria-* attribute" do
+ expect(browser.p.aria_label).to eq "ruby-library"
+ end
+ end
+
+ describe "visible text" do
+ it "finds elements by visible text" do
+ browser.goto WatirSpec.url_for('non_control_elements.html')
+
+ expect(browser.link(visible_text: "all visible")).to exist
+ expect(browser.link(visible_text: /all visible/)).to exist
+ expect(browser.link(visible_text: "some visible")).to exist
+ expect(browser.link(visible_text: /some visible/)).to exist
+ expect(browser.link(visible_text: "none visible")).not_to exist
+ expect(browser.link(visible_text: /none visible/)).not_to exist
+
+ expect(browser.link(visible_text: "Link 2", class: "external")).to exist
+ expect(browser.link(visible_text: /Link 2/, class: "external")).to exist
+
+ 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: /some visible/)).to exist
+ end
+ 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 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 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 several elements from an element's subtree" do
+ expect(browser.fieldset.elements(xpath: ".//label").length).to eq 21
+ 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
+
+ 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 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
+
+ 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 FileField instance" do
+ e = browser.input(xpath: "//input[@type='file']").to_subtype
+ expect(e).to be_kind_of(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)
+ 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"
+ end
+ end
+
+ bug "https://github.com/SeleniumHQ/selenium/issues/2555", %i(remote firefox) do
+ bug "https://github.com/SeleniumHQ/selenium/issues/1795", %i(remote edge) do
+ describe "#focused?" 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
+ end
+ 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"
+ end
+ end
+
+ describe "#visible?" do
+ it "returns true if the element is visible" do
+ expect(browser.text_field(id: "new_user_email")).to be_visible
+ end
+
+ it "raises UnknownObjectException exception if the element does not exist" do
+ expect { browser.text_field(id: "no_such_id").visible? }.to raise_unknown_object_exception
+ end
+
+ it "raises UnknownObjectException exception if the element is stale" do
+ wd_element = browser.text_field(id: "new_user_email").wd
+
+ # simulate element going stale during lookup
+ allow(browser.driver).to receive(:find_element).with(:css, '#new_user_email') { wd_element }
+ allow(browser.driver).to receive(:find_elements).with(:css, '#new_user_email') { [wd_element] }
+ allow(browser.driver).to receive(:find_elements).with(:tag_name, 'iframe') { [] }
+ browser.refresh
+
+ expect { browser.text_field(css: '#new_user_email').visible? }.to raise_unknown_object_exception
+ end
+
+ it "returns true if the element has style='visibility: visible' even if parent has style='visibility: hidden'" do
+ expect(browser.div(id: "visible_child")).to be_visible
+ end
+
+ it "returns false if the element is input element where type eq 'hidden'" do
+ expect(browser.hidden(id: "new_user_interests_dolls")).to_not be_visible
+ end
+
+ it "returns false if the element has style='display: none;'" do
+ expect(browser.div(id: 'changed_language')).to_not be_visible
+ end
+
+ it "returns false if the element has style='visibility: hidden;" do
+ expect(browser.div(id: 'wants_newsletter')).to_not be_visible
+ end
+
+ it "returns false if one of the parent elements is hidden" do
+ expect(browser.div(id: 'hidden_parent')).to_not be_visible
+ end
+ end
+
+ describe "#exist?" do
+ context ":class locator" do
+ before do
+ browser.goto(WatirSpec.url_for("class_locator.html"))
+ 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 "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 "does not match only part of the class name" do
+ expect(browser.div(class: "bc")).to_not exist
+ 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"])
+ expect(e).to exist
+ expect(e.class_name).to eq "a"
+ end
+
+ it "matches a non-ordered subset" do
+ e = browser.div(class: ["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
+ end
+ end
+
+ context "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
+ 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 "doesn't raise when called on nested elements" do
+ expect(browser.div(id: 'no_such_div').link(id: 'no_such_id')).to_not exist
+ end
+
+ it "raises if both :xpath and :css are given" do
+ expect { browser.div(xpath: "//div", css: "div").exists? }.to raise_error(ArgumentError)
+ end
+
+ it "doesn't raise when selector has with :xpath has :index" do
+ expect(browser.div(xpath: "//div", index: 1)).to exist
+ end
+
+ it "raises ArgumentError error if selector hash with :xpath has multiple entries" do
+ expect { browser.div(xpath: "//div", class: "foo").exists? }.to raise_error(ArgumentError)
+ end
+
+ it "doesn't raise when selector has with :css has :index" do
+ expect(browser.div(css: "div", index: 1)).to exist
+ end
+
+ it "raises ArgumentError error if selector hash with :css has multiple entries" do
+ expect { browser.div(css: "div", class: "foo").exists? }.to raise_error(ArgumentError)
+ end
+
+ 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
+
+ describe '#send_keys' do
+ before(:each) do
+ @c = Selenium::WebDriver::Platform.mac? ? :command : :control
+ browser.goto(WatirSpec.url_for('keylogger.html'))
+ end
+
+ let(:receiver) { browser.text_field(id: 'receiver') }
+ let(:events) { browser.element(id: 'output').ps.size }
+
+ 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 'accepts arbitrary list of arguments' do
+ receiver.send_keys 'hello', 'world'
+ expect(receiver.value).to eq 'helloworld'
+ expect(events).to eq 10
+ end
+
+ bug "http://code.google.com/p/chromium/issues/detail?id=93879", :chrome do
+ not_compliant_on :safari, :firefox do
+ it 'performs key combinations' 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
+
+ it 'performs arbitrary list of key combinations' 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 '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
+ end
+
+ describe "#flash" do
+
+ let(:h2) { browser.h2(text: 'Add user') }
+
+ it 'returns the element on which it was called' do
+ expect(h2.flash).to eq h2
+ 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')
+ end
+ end
+
+ describe '#inner_text' do
+ it 'returns inner HTML code of element' 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
+
+ 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 '#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')
+ expected_text = "<div id=\"shown\"><div id=\"hidden\" style=\"display: none;\">Not shown</div><div>Not hidden</div></div>"
+ expect(div.outer_html).to eq expected_text
+ end
+ end
+
+ not_compliant_on %i(remote firefox) do
+ describe '#scroll_into_view' do
+ it 'scrolls element into view' do
+ el = browser.button(name: 'new_user_image')
+ element_center = el.center['y']
+
+ bottom_viewport_script = 'return window.pageYOffset + window.innerHeight'
+ expect(browser.execute_script bottom_viewport_script).to be < element_center
+
+ expect(el.scroll_into_view).to be_a Selenium::WebDriver::Point
+
+ expect(browser.execute_script bottom_viewport_script).to be > element_center
+ end
+ end
+ end
+
+ describe '#location' do
+ it 'returns coordinates for element location' do
+ location = browser.button(name: 'new_user_image').location
+
+ expect(location).to be_a Selenium::WebDriver::Point
+ expect(location['y']).to be > 0
+ expect(location['x']).to be > 0
+ 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
+ expect(size['width']).to eq 104.0
+ expect(size['height']).to eq 70.0
+ end
+ end
+
+ describe '#height' do
+ it 'returns height of element' do
+ height = browser.button(name: 'new_user_image').height
+
+ expect(height).to eq 70.0
+ end
+ end
+
+ describe '#width' do
+ it 'returns width of element' do
+ width = browser.button(name: 'new_user_image').width
+
+ expect(width).to eq 104.0
+ end
+
+ end
+
+ describe '#center' do
+ it 'returns center of element' do
+ center = browser.button(name: 'new_user_image').center
+
+ 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