86 lines
2.9 KiB
Ruby
86 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
Capybara::SpecHelper.spec '#ancestor' do
|
|
before do
|
|
@session.visit('/with_html')
|
|
end
|
|
|
|
after do
|
|
Capybara::Selector.remove(:monkey)
|
|
end
|
|
|
|
it "should find the ancestor element using the given locator" do
|
|
el = @session.find(:css, '#first_image')
|
|
expect(el.ancestor('//p')).to have_text('Lorem ipsum dolor')
|
|
expect(el.ancestor("//a")[:'aria-label']).to eq('Go to simple')
|
|
end
|
|
|
|
it "should find the ancestor element using the given locator and options" do
|
|
el = @session.find(:css, '#child')
|
|
expect(el.ancestor('//div', text: 'Ancestor Ancestor Ancestor')[:id]).to eq('ancestor3')
|
|
end
|
|
|
|
it "should raise an error if there are multiple matches" do
|
|
el = @session.find(:css, '#child')
|
|
expect { el.ancestor('//div') }.to raise_error(Capybara::Ambiguous)
|
|
expect { el.ancestor('//div', text: 'Ancestor') }.to raise_error(Capybara::Ambiguous)
|
|
end
|
|
|
|
context "with css selectors" do
|
|
it "should find the first element using the given locator" do
|
|
el = @session.find(:css, '#first_image')
|
|
expect(el.ancestor(:css, 'p')).to have_text('Lorem ipsum dolor')
|
|
expect(el.ancestor(:css, 'a')[:'aria-label']).to eq('Go to simple')
|
|
end
|
|
|
|
it "should support pseudo selectors" do
|
|
el = @session.find(:css, '#button_img')
|
|
expect(el.ancestor(:css, 'button:disabled')[:id]).to eq('ancestor_button')
|
|
end
|
|
end
|
|
|
|
context "with xpath selectors" do
|
|
it "should find the first element using the given locator" do
|
|
el = @session.find(:css, '#first_image')
|
|
expect(el.ancestor(:xpath, '//p')).to have_text('Lorem ipsum dolor')
|
|
expect(el.ancestor(:xpath, "//a")[:'aria-label']).to eq('Go to simple')
|
|
end
|
|
end
|
|
|
|
context "with custom selector" do
|
|
it "should use the custom selector" do
|
|
Capybara.add_selector(:level) do
|
|
xpath { |num| ".//*[@id='ancestor#{num}']" }
|
|
end
|
|
el = @session.find(:css, '#child')
|
|
expect(el.ancestor(:level, 1).text).to eq('Ancestor Child')
|
|
expect(el.ancestor(:level, 3).text).to eq('Ancestor Ancestor Ancestor Child')
|
|
end
|
|
end
|
|
|
|
|
|
it "should raise ElementNotFound with a useful default message if nothing was found" do
|
|
el = @session.find(:css, '#child')
|
|
expect do
|
|
el.ancestor(:xpath, '//div[@id="nosuchthing"]')
|
|
end.to raise_error(Capybara::ElementNotFound, "Unable to find xpath \"//div[@id=\\\"nosuchthing\\\"]\" that is an ancestor of visible css \"#child\"")
|
|
end
|
|
|
|
|
|
|
|
context "within a scope" do
|
|
it "should limit the ancestors to inside the scope" do
|
|
@session.within(:css, '#ancestor2') do
|
|
el = @session.find(:css, '#child')
|
|
expect(el.ancestor(:css,'div', text: 'Ancestor')[:id]).to eq('ancestor1')
|
|
end
|
|
end
|
|
end
|
|
|
|
it "should raise if selector type is unknown" do
|
|
el = @session.find(:css, '#child')
|
|
expect do
|
|
el.ancestor(:unknown, '//h1')
|
|
end.to raise_error(ArgumentError)
|
|
end
|
|
end
|