Path: blob/trunk/rb/spec/integration/selenium/webdriver/target_locator_spec.rb
1864 views
# frozen_string_literal: true12# Licensed to the Software Freedom Conservancy (SFC) under one3# or more contributor license agreements. See the NOTICE file4# distributed with this work for additional information5# regarding copyright ownership. The SFC licenses this file6# to you under the Apache License, Version 2.0 (the7# "License"); you may not use this file except in compliance8# with the License. You may obtain a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing,13# software distributed under the License is distributed on an14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY15# KIND, either express or implied. See the License for the16# specific language governing permissions and limitations17# under the License.1819require_relative 'spec_helper'2021module Selenium22module WebDriver23describe TargetLocator, exclusive: {bidi: false, reason: 'Not yet implemented with BiDi'} do24before { @original_window = driver.window_handle }2526after do27if GlobalTestEnv.rbe? && GlobalTestEnv.browser == :chrome28reset_driver!29else30handles = driver.window_handles31driver.switch_to.window(@original_window) if handles.include?(@original_window)3233(handles - [driver.window_handle]).each do |handle|34driver.switch_to.window(handle) { driver.close }35end36end37end3839let(:new_window) { driver.window_handles.find { |handle| handle != driver.window_handle } }4041it 'finds the active element' do42driver.navigate.to url_for('xhtmlTest.html')43expect(driver.switch_to.active_element).to be_an_instance_of(WebDriver::Element)44end4546# Doesn't switch to frame by id directly47it 'switches to a frame directly' do48driver.navigate.to url_for('iframes.html')49driver.switch_to.frame('iframe1')5051expect(driver.find_element(name: 'login')).to be_a(WebDriver::Element)52end5354it 'switches to a frame by Element' do55driver.navigate.to url_for('iframes.html')5657iframe = driver.find_element(tag_name: 'iframe')58driver.switch_to.frame(iframe)5960expect(driver.find_element(name: 'login')).to be_a(WebDriver::Element)61end6263it 'switches to parent frame' do64driver.navigate.to url_for('iframes.html')6566iframe = driver.find_element(tag_name: 'iframe')67driver.switch_to.frame(iframe)6869expect(driver.find_element(name: 'login')).to be_a(WebDriver::Element)7071driver.switch_to.parent_frame72expect(driver.find_element(id: 'iframe_page_heading')).to be_a(WebDriver::Element)73end7475context 'when switching windows' do76describe '#new_window' do77it 'switches to a new window' do78driver.switch_to.new_window(:window)7980expect(driver.window_handles.size).to eq 281expect(driver.window_handle).not_to eq @original_window82end8384it 'switches to a new tab' do85driver.switch_to.new_window(:tab)8687expect(driver.window_handles.size).to eq 288expect(driver.window_handle).not_to eq @original_window89end9091it 'raises exception when the new window type is not recognized' do92expect {93driver.switch_to.new_window(:unknown)94}.to raise_error(ArgumentError)95end9697it 'switches to the new window then close it when given a block' do98driver.switch_to.new_window do99expect(driver.window_handles.size).to eq 2100end101102expect(driver.window_handles.size).to eq 1103expect(driver.window_handle).to eq @original_window104end105106it 'does not error if switching to a new window with a block that closes window' do107expect {108driver.switch_to.new_window { driver.close }109}.not_to raise_exception110end111end112113it 'switches to a window and back when given a block' do114driver.navigate.to url_for('xhtmlTest.html')115116driver.find_element(link: 'Open new window').click117wait.until { driver.window_handles.size == 2 }118expect(driver.title).to eq('XHTML Test Page')119120driver.switch_to.window(new_window) do121wait.until { driver.title == 'We Arrive Here' }122end123124wait.until { driver.title == 'XHTML Test Page' }125end126127it 'handles exceptions inside the block' do128driver.navigate.to url_for('xhtmlTest.html')129130driver.find_element(link: 'Open new window').click131wait.until { driver.window_handles.size == 2 }132expect(driver.title).to eq('XHTML Test Page')133134expect {135driver.switch_to.window(new_window) { raise 'foo' }136}.to raise_error(RuntimeError, 'foo')137138expect(driver.title).to eq('XHTML Test Page')139end140141it 'switches to a window without a block' do142driver.navigate.to url_for('xhtmlTest.html')143144driver.find_element(link: 'Open new window').click145wait.until { driver.window_handles.size == 2 }146expect(driver.title).to eq('XHTML Test Page')147148driver.switch_to.window(new_window)149wait.until { driver.title == 'We Arrive Here' }150expect(driver.title).to eq('We Arrive Here')151end152153it 'uses the original window if the block closes the popup' do154driver.navigate.to url_for('xhtmlTest.html')155156driver.find_element(link: 'Open new window').click157wait.until { driver.window_handles.size == 2 }158expect(driver.title).to eq('XHTML Test Page')159160driver.switch_to.window(new_window) do161wait.until { driver.title == 'We Arrive Here' }162driver.close163end164165expect(driver.current_url).to include('xhtmlTest.html')166expect(driver.title).to eq('XHTML Test Page')167end168end169170context 'with more than two windows', except: [{browser: %i[safari safari_preview]},171{driver: :remote, browser: :ie}] do172it 'closes current window via block' do173driver.navigate.to url_for('xhtmlTest.html')174wait_for_element(link: 'Create a new anonymous window')175driver.find_element(link: 'Create a new anonymous window').click176wait.until { driver.window_handles.size == 2 }177driver.find_element(link: 'Open new window').click178wait.until { driver.window_handles.size == 3 }179driver.switch_to.window(new_window)180181driver.switch_to.window(driver.window_handle) { driver.close }182expect(driver.window_handles.size).to eq 2183end184185it 'closes another window' do186driver.navigate.to url_for('xhtmlTest.html')187wait_for_element(link: 'Create a new anonymous window')188driver.find_element(link: 'Create a new anonymous window').click189wait.until { driver.window_handles.size == 2 }190driver.find_element(link: 'Open new window').click191wait.until { driver.window_handles.size == 3 }192193window_to_close = driver.window_handles.last194195driver.switch_to.window(window_to_close) { driver.close }196expect(driver.window_handles.size).to eq 2197end198199it 'iterates over open windows when current window is not closed' do200driver.navigate.to url_for('xhtmlTest.html')201wait_for_element(link: 'Create a new anonymous window')202driver.find_element(link: 'Create a new anonymous window').click203wait.until { driver.window_handles.size == 2 }204driver.find_element(link: 'Open new window').click205wait.until { driver.window_handles.size == 3 }206207titles = {}208driver.window_handles.each do |wh|209driver.switch_to.window(wh) { titles[driver.title] = driver.window_handle }210end211212handle = titles['We Arrive Here']213214driver.switch_to.window(handle)215expect(driver.title).to eq('We Arrive Here')216end217218it 'iterates over open windows when current window is closed' do219driver.navigate.to url_for('xhtmlTest.html')220wait_for_element(link: 'Create a new anonymous window')221driver.find_element(link: 'Create a new anonymous window').click222wait.until { driver.window_handles.size == 2 }223driver.find_element(link: 'Open new window').click224wait.until { driver.window_handles.size == 3 }225226driver.close227228titles = {}229driver.window_handles.each do |wh|230driver.switch_to.window(wh) { titles[driver.title] = wh }231end232233handle = titles['We Arrive Here']234driver.switch_to.window(handle)235expect(driver.title).to eq('We Arrive Here')236end237end238239it 'switches to a window and execute a block when current window is closed' do240driver.navigate.to url_for('xhtmlTest.html')241driver.find_element(link: 'Open new window').click242wait.until { driver.window_handles.size == 2 }243244driver.switch_to.window(new_window)245wait.until { driver.title == 'We Arrive Here' }246247driver.close248249driver.switch_to.window(driver.window_handles.first) do250wait.until { driver.title == 'XHTML Test Page' }251end252253expect(driver.title).to eq('XHTML Test Page')254end255256it 'switches to default content' do257driver.navigate.to url_for('iframes.html')258259driver.switch_to.frame 0260driver.switch_to.default_content261262expect(driver.find_elements(id: 'iframe_page_heading').size).to be_positive263end264265# Edge BUG - https://connect.microsoft.com/IE/feedback/details/1850030266describe 'alerts' do267it 'allows the user to accept an alert' do268driver.navigate.to url_for('alerts.html')269driver.find_element(id: 'alert').click270271alert = wait_for_alert272alert.accept273wait_for_no_alert274275expect(driver.title).to eq('Testing Alerts')276end277278it 'allows the user to dismiss an alert' do279driver.navigate.to url_for('alerts.html')280driver.find_element(id: 'alert').click281282alert = wait_for_alert283alert.dismiss284wait_for_no_alert285286expect(driver.title).to eq('Testing Alerts')287end288289it 'allows the user to set the value of a prompt' do290driver.navigate.to url_for('alerts.html')291driver.find_element(id: 'prompt').click292293alert = wait_for_alert294alert.send_keys 'cheese'295alert.accept296297text = driver.find_element(id: 'text').text298expect(text).to eq('cheese')299end300301it 'allows the user to get the text of an alert' do302driver.navigate.to url_for('alerts.html')303driver.find_element(id: 'alert').click304305alert = wait_for_alert306text = alert.text307alert.accept308309expect(text).to eq('cheese')310wait_for_no_alert311end312313it 'raises when calling #text on a closed alert' do314driver.navigate.to url_for('alerts.html')315wait_for_element(id: 'alert')316317driver.find_element(id: 'alert').click318319alert = wait_for_alert320alert.accept321322wait_for_no_alert323expect { alert.text }.to raise_error(Selenium::WebDriver::Error::NoSuchAlertError)324end325326it 'raises NoAlertOpenError if no alert is present' do327expect { driver.switch_to.alert }.to raise_error(Selenium::WebDriver::Error::NoSuchAlertError)328end329330describe 'unhandled alert error' do331it 'raises an UnexpectedAlertOpenError if an alert has not been dealt with' do332driver.navigate.to url_for('alerts.html')333driver.find_element(id: 'alert').click334wait_for_alert335336expect { driver.title }.to raise_error(Selenium::WebDriver::Error::UnexpectedAlertOpenError)337end338end339end340end341end # WebDriver342end # Selenium343344345