# encoding: utf-8 # # Licensed to the Software Freedom Conservancy (SFC) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The SFC licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. module Selenium module Client # Convenience methods not explicitly part of the protocol module Extensions # These for all Ajax request to finish (Only works if you are using prototype, the wait happens in the browser) def wait_for_ajax(options={}) builder = JavascriptExpressionBuilder.new active_javascript_framework(options) wait_for_condition builder.no_pending_ajax_requests.script, options[:timeout_in_seconds] end # Wait for all Prototype effects to be processed (the wait happens in the browser). # # Credits to http://github.com/brynary/webrat/tree/master def wait_for_effects(options={}) builder = JavascriptExpressionBuilder.new active_javascript_framework(options) wait_for_condition builder.no_pending_effects.script, options[:timeout_in_seconds] end # Wait for an element to be present (the wait happens in the browser). def wait_for_element(locator, options={}) builder = JavascriptExpressionBuilder.new builder.find_element(locator).append("element != null;") wait_for_condition builder.script, options[:timeout_in_seconds] end # Wait for an element to NOT be present (the wait happens in the browser). def wait_for_no_element(locator, options={}) builder = JavascriptExpressionBuilder.new builder.find_element(locator).append("element == null;") wait_for_condition builder.script, options[:timeout_in_seconds] end # Wait for some text to be present (the wait is happening browser side). # # wait_for_text will search for the given argument within the innerHTML # of the current DOM. Note that this method treats a single string # as a special case. # # ==== Parameters # wait_for_text accepts an optional hash of parameters: # * :element - a selenium locator for an element limiting # the search scope. # * :timeout_in_seconds - duration in seconds after which we # time out if text cannot be found. # # ==== Regular Expressions # In addition to plain strings, wait_for_text accepts regular expressions # as the pattern specification. # # ==== Examples # The following are equivalent, and will match "some text" anywhere # within the document: # wait_for_text "some text" # wait_for_text /some text/ # # This will match "some text" anywhere within the specified element: # wait_for_text /some text/, :element => "container" # # This will match "some text" only if it exactly matches the complete # innerHTML of the specified element: # wait_for_text "some text", :element => "container" # def wait_for_text(pattern, options={}) builder = JavascriptExpressionBuilder.new builder.find_text(pattern, options).append("text_match == true;") wait_for_condition builder.script, options[:timeout_in_seconds] end # Wait for some text to NOT be present (the wait happens in the browser). # # See wait_for_text for usage details. def wait_for_no_text(pattern, options={}) builder = JavascriptExpressionBuilder.new builder.find_text(pattern, options).append("text_match == false;") wait_for_condition builder.script, options[:timeout_in_seconds] end # Wait for a field to get a specific value (the wait happens in the browser). def wait_for_field_value(locator, expected_value, options={}) builder = JavascriptExpressionBuilder.new builder.find_element(locator).element_value_is(expected_value) wait_for_condition builder.script, options[:timeout_in_seconds] end # Wait for a field to not have a specific value (the wait happens in the browser). def wait_for_no_field_value(locator, expected_value, options={}) builder = JavascriptExpressionBuilder.new builder.find_element(locator).element_value_is_not(expected_value) wait_for_condition builder.script, options[:timeout_in_seconds] end # Wait for something to be visible (the wait happens in the browser). def wait_for_visible(locator, options={}) builder = JavascriptExpressionBuilder.new wait_for_condition builder.visible(locator).script, options[:timeout_in_seconds] end # Wait for something to not be visible (the wait happens in the browser). def wait_for_not_visible(locator, options={}) builder = JavascriptExpressionBuilder.new wait_for_condition builder.not_visible(locator).script, options[:timeout_in_seconds] end def active_javascript_framework(options) options[:javascript_framework] || default_javascript_framework end end end end