blob: d07260be1d3dc16bb4dcb4b20cd1e8ab661ea1d3 [file] [log] [blame]
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