module Selenium module Client class JavascriptExpressionBuilder attr_reader :script def initialize(javascript_framework_name=nil) @framework = javascript_framework_for(javascript_framework_name) if javascript_framework_name @script = "" end def append(text) @script << text self end def no_pending_ajax_requests append window_script("#{@framework.ajax_request_tracker} == 0") end def no_pending_effects append window_script("Effect.Queue.size() == 0") end def visible(locator) append "selenium.isVisible('#{quote_escaped(locator)}')" end def not_visible(locator) append "!selenium.isVisible('#{quote_escaped(locator)}')" end def find_element(locator) append <<-EOS var element; try { element = selenium.browserbot.findElement('#{quote_escaped(locator)}'); } catch(e) { element = null; } EOS end def element_value_is(expected_value) append "(element != null && element.value == '#{quote_escaped(expected_value)}')" end def element_value_is_not(expected_value) append "(element == null || element.value != '#{quote_escaped(expected_value)}')" end def find_text(pattern, options) if options[:element].nil? find_text_in_document pattern, options else find_text_in_element pattern, options end self end def find_text_in_document(pattern, options) js_regexp = case pattern when Regexp pattern.inspect else /#{pattern}/.inspect end append <<-EOS var text_match; text_match = (null != selenium.browserbot.getCurrentWindow().document.body.innerHTML.match(#{js_regexp})); EOS end def find_text_in_element(pattern, options) find_element(options[:element]) append <<-EOS var text_match; text_match = (element != null && #{text_match(pattern)}); EOS self end def text_match(pattern) case pattern when Regexp "null != element.innerHTML.match(#{pattern.inspect})" else "element.innerHTML == '#{quote_escaped(pattern)}'" end end def javascript_framework_for(framework_name) case framework_name.to_sym when :prototype JavascriptFrameworks::Prototype when :jquery JavascriptFrameworks::JQuery else raise "Unsupported Javascript Framework: #{framework_name}" end end def window_script(expression) "selenium.browserbot.getCurrentWindow().#{expression};" end def quote_escaped(a_string) a_string.gsub(/\\/, "\\\\\\").gsub(/'/, %q<\\\'>) end end end end