lib/testcentricity/app_elements/alert.rb in testcentricity-3.0.2 vs lib/testcentricity/app_elements/alert.rb in testcentricity-3.0.3

- old
+ new

@@ -3,25 +3,89 @@ def initialize(name, parent, locator, context) super @type = :alert end + # Wait until the alert modal is visible, or until the specified wait time has expired. If the wait time is nil, then the + # wait time will be Environ.default_max_wait_time. Unlike wait_until_visible or wait_until_exists, this method does not + # raise an exception if the alert modal does not appear within the specified wait time. + # Returns true if the alert modal is visible. + # + # @return [Integer] + # @param seconds [Integer or Float] wait time in seconds + # @example + # permissions_modal.await(2) + # def await(seconds) timeout = seconds.nil? ? Environ.default_max_wait_time : seconds wait = Selenium::WebDriver::Wait.new(timeout: timeout) wait.until { exists? } true rescue false end + # Performs the action required accept the currently visible alert modal. If the alert modal is still visible after + # 5 seconds, an exception is raised. + # + # @example + # alert_modal.accept + # def accept alert_accept wait_until_gone(5) end + # Performs the action required dismiss the currently visible alert modal. If the alert modal is still visible after + # 5 seconds, an exception is raised. + # + # @example + # alert_modal.dismiss + # def dismiss alert_dismiss wait_until_gone(5) + end + + # + # @return [Integer] + # @param action [Symbol] action to perform if alert modal is visible. Acceptable values are :allow, :accept, :dont_allow, or :dismiss + # @param timeout [Integer or Float] wait time in seconds. Defaults to 2 if not specified + # @param button_name [String] optional caption of button to tap associated with the specified action + # @example + # alert_modal.await_and_respond(:dismiss) + # OR + # permissions_modal.await_and_respond(:accept, timeout = 1, button_name = 'Allow Once') + # + def await_and_respond(action, timeout = 2, button_name = nil) + if await(timeout) + case action + when :allow, :accept + if button_name.nil? + accept + elsif Environ.is_ios? + $driver.execute_script('mobile: alert', { action: 'accept', buttonLabel: button_name }) + else + $driver.execute_script('mobile: acceptAlert', { buttonLabel: button_name }) + end + when :dont_allow, :dismiss + if button_name.nil? + dismiss + elsif Environ.is_ios? + $driver.execute_script('mobile: alert', { action: 'dismiss', buttonLabel: button_name }) + else + $driver.execute_script('mobile: dismissAlert', { buttonLabel: button_name }) + end + else + raise "#{action} is not a valid selector" + end + if Environ.is_ios? && await(1) + buttons = $driver.execute_script('mobile: alert', { action: 'getButtons' }) + raise "Could not perform #{action} action on active modal. Available modal buttons are #{buttons}" + end + true + else + false + end end end end