# Copyright 2006 ThoughtWorks, Inc # # Licensed 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. # # ----------------- # Original code by Aslak Hellesoy and Darren Hobbs # This file has been automatically generated via XSL # ----------------- require 'net/http' require 'uri' require 'cgi' # Defines an object that runs Selenium commands. # # ===Element Locators # Element Locators tell Selenium which HTML element a command refers to. # The format of a locator is: # locatorType=argument # We support the following strategies for locating elements: # # * identifier=id:: # Select the element with the specified @id attribute. If no match is # found, select the first element whose @name attribute is id. # (This is normally the default; see below.) # * id=id:: # Select the element with the specified @id attribute. # * name=name:: # Select the first element with the specified @name attribute. # # * username # * name=username # # # # The name may optionally be followed by one or more element-filters, separated from the name by whitespace. If the filterType is not specified, value is assumed. # # * name=flavour value=chocolate # # # * dom=javascriptExpression:: # # Find an element using JavaScript traversal of the HTML Document Object # Model. DOM locators must begin with "document.". # * dom=document.forms['myForm'].myDropdown # * dom=document.images[56] # # # # * xpath=xpathExpression:: # Locate an element using an XPath expression. # * xpath=//img[@alt='The image alt text'] # * xpath=//table[@id='table1']//tr[4]/td[2] # # # * link=textPattern:: # Select the link (anchor) element which contains text matching the # specified pattern. # * link=The link text # # # # # Without an explicit locator prefix, Selenium uses the following default # strategies: # # * dom, for locators starting with "document." # * xpath, for locators starting with "//" # * identifier, otherwise # # ===Element FiltersElement filters can be used with a locator to refine a list of candidate elements. They are currently used only in the 'name' element-locator. # Filters look much like locators, ie. # filterType=argumentSupported element-filters are: # value=valuePattern # # Matches elements based on their values. This is particularly useful for refining a list of similarly-named toggle-buttons.index=index # # Selects a single element based on its position in the list (offset from zero).===String-match Patterns # Various Pattern syntaxes are available for matching string values: # # * glob:pattern:: # Match a string against a "glob" (aka "wildmat") pattern. "Glob" is a # kind of limited regular-expression syntax typically used in command-line # shells. In a glob pattern, "*" represents any sequence of characters, and "?" # represents any single character. Glob patterns match against the entire # string. # * regexp:regexp:: # Match a string using a regular-expression. The full power of JavaScript # regular-expressions is available. # * exact:string:: # Match a string exactly, verbatim, without any of that fancy wildcard # stuff. # # # If no pattern prefix is specified, Selenium assumes that it's a "glob" # pattern. # # module Selenium class SeleneseInterpreter include Selenium def initialize(server_host, server_port, browserStartCommand, browserURL, timeout=30000) @server_host = server_host @server_port = server_port @browserStartCommand = browserStartCommand @browserURL = browserURL @timeout = timeout end def to_s "SeleneseInterpreter" end def start() result = get_string("getNewBrowserSession", [@browserStartCommand, @browserURL]) @session_id = result end def stop() do_command("testComplete", []) @session_id = nil end def do_command(verb, args) timeout(@timeout) do http = Net::HTTP.new(@server_host, @server_port) command_string = '/selenium-server/driver/?cmd=' + CGI::escape(verb) args.length.times do |i| arg_num = (i+1).to_s command_string = command_string + "&" + arg_num + "=" + CGI::escape(args[i].to_s) end if @session_id != nil command_string = command_string + "&sessionId=" + @session_id.to_s end #print "Requesting --->" + command_string + "\n" response, result = http.get(command_string) #print "RESULT: " + result + "\n\n" if (result[0..1] != "OK") raise SeleniumCommandError, result end return result end end def get_string(verb, args) result = do_command(verb, args) return result[3..result.length] end def get_string_array(verb, args) csv = get_string(verb, args) token = "" tokens = [] csv.length.times do |i| letter = csv[i,1] if (letter == '\\') i++ letter = csv[i,1] token = token + letter elsif (letter == ',') tokens.push(token) token = "" else token = token + letter end end tokens.push(token) return tokens end def get_number(verb, args) # Is there something I need to do here? return get_string(verb, args) end def get_number_array(verb, args) # Is there something I need to do here? return get_string_array(verb, args) end def get_boolean(verb, args) boolstr = get_string(verb, args) if ("true" == boolstr) return true end if ("false" == boolstr) return false end raise ValueError, "result is neither 'true' nor 'false': " + boolstr end def get_boolean_array(verb, args) boolarr = get_string_array(verb, args) boolarr.length.times do |i| if ("true" == boolstr) boolarr[i] = true next end if ("false" == boolstr) boolarr[i] = false next end raise ValueError, "result is neither 'true' nor 'false': " + boolarr[i] end return boolarr end # Clicks on a link, button, checkbox or radio button. If the click action # causes a new page to load (like a link usually does), call # waitForPageToLoad. # # 'locator' is an element locator def click(locator) do_command("click", [locator,]) end # Explicitly simulate an event, to trigger the corresponding "onevent" # handler. # # 'locator' is an element locator # 'eventName' is the event name, e.g. "focus" or "blur" def fire_event(locator,eventName) do_command("fireEvent", [locator,eventName,]) end # Simulates a user pressing and releasing a key. # # 'locator' is an element locator # 'keycode' is the numeric keycode of the key to be pressed, normally the ASCII value of that key. def key_press(locator,keycode) do_command("keyPress", [locator,keycode,]) end # Simulates a user pressing a key (without releasing it yet). # # 'locator' is an element locator # 'keycode' is the numeric keycode of the key to be pressed, normally the ASCII value of that key. def key_down(locator,keycode) do_command("keyDown", [locator,keycode,]) end # Simulates a user releasing a key. # # 'locator' is an element locator # 'keycode' is the numeric keycode of the key to be released, normally the ASCII value of that key. def key_up(locator,keycode) do_command("keyUp", [locator,keycode,]) end # Simulates a user hovering a mouse over the specified element. # # 'locator' is an element locator def mouse_over(locator) do_command("mouseOver", [locator,]) end # Simulates a user pressing the mouse button (without releasing it yet) on # the specified element. # # 'locator' is an element locator def mouse_down(locator) do_command("mouseDown", [locator,]) end # Sets the value of an input field, as though you typed it in. # # Can also be used to set the value of combo boxes, check boxes, etc. In these cases, # value should be the value of the option selected, not the visible text. # # # 'locator' is an element locator # 'value' is the value to type def type(locator,value) do_command("type", [locator,value,]) end # Check a toggle-button (checkbox/radio) # # 'locator' is an element locator def check(locator) do_command("check", [locator,]) end # Uncheck a toggle-button (checkbox/radio) # # 'locator' is an element locator def uncheck(locator) do_command("uncheck", [locator,]) end # Select an option from a drop-down using an option locator. # # # Option locators provide different ways of specifying options of an HTML # Select element (e.g. for selecting a specific option, or for asserting # that the selected option satisfies a specification). There are several # forms of Select Option Locator. # # * label=labelPattern:: # matches options based on their labels, i.e. the visible text. (This # is the default.) # * label=regexp:^[Oo]ther # # # * value=valuePattern:: # matches options based on their values. # * value=other # # # * id=id:: # matches options based on their ids. # * id=option1 # # # * index=index:: # matches an option based on its index (offset from zero). # * index=2 # # # # # If no option locator prefix is provided, the default behaviour is to match on label. # # # # 'selectLocator' is an element locator identifying a drop-down menu # 'optionLocator' is an option locator (a label by default) def select(selectLocator,optionLocator) do_command("select", [selectLocator,optionLocator,]) end # Add a selection to the set of selected options in a multi-select element using an option locator. # # @see #doSelect for details of option locators # # 'locator' is an element locator identifying a multi-select box # 'optionLocator' is an option locator (a label by default) def add_selection(locator,optionLocator) do_command("addSelection", [locator,optionLocator,]) end # Remove a selection from the set of selected options in a multi-select element using an option locator. # # @see #doSelect for details of option locators # # 'locator' is an element locator identifying a multi-select box # 'optionLocator' is an option locator (a label by default) def remove_selection(locator,optionLocator) do_command("removeSelection", [locator,optionLocator,]) end # Submit the specified form. This is particularly useful for forms without # submit buttons, e.g. single-input "Search" forms. # # 'formLocator' is an element locator for the form you want to submit def submit(formLocator) do_command("submit", [formLocator,]) end # Opens an URL in the test frame. This accepts both relative and absolute # URLs. # # The "open" command waits for the page to load before proceeding, # ie. the "AndWait" suffix is implicit. # # Note: The URL must be on the same domain as the runner HTML # due to security restrictions in the browser (Same Origin Policy). If you # need to open an URL on another domain, use the Selenium Server to start a # new browser session on that domain. # # 'url' is the URL to open; may be relative or absolute def open(url) do_command("open", [url,]) end # Selects a popup window; once a popup window has been selected, all # commands go to that window. To select the main window again, use "null" # as the target. # # 'windowID' is the JavaScript window ID of the window to select def select_window(windowID) do_command("selectWindow", [windowID,]) end # Waits for a popup window to appear and load up. # # 'windowID' is the JavaScript window ID of the window that will appear # 'timeout' is a timeout in milliseconds, after which the action will return with an error def wait_for_pop_up(windowID,timeout) do_command("waitForPopUp", [windowID,timeout,]) end # By default, Selenium's overridden window.confirm() function will # return true, as if the user had manually clicked OK. After running # this command, the next call to confirm() will return false, as if # the user had clicked Cancel. # def choose_cancel_on_next_confirmation() do_command("chooseCancelOnNextConfirmation", []) end # Instructs Selenium to return the specified answer string in response to # the next JavaScript prompt [window.prompt()]. # # 'answer' is the answer to give in response to the prompt pop-up def answer_on_next_prompt(answer) do_command("answerOnNextPrompt", [answer,]) end # Simulates the user clicking the "back" button on their browser. # def go_back() do_command("goBack", []) end # Simulates the user clicking the "Refresh" button on their browser. # def refresh() do_command("refresh", []) end # Simulates the user clicking the "close" button in the titlebar of a popup # window or tab. # def close() do_command("close", []) end # Has an alert occurred? # # # This function never throws an exception # # # def is_alert_present() return get_boolean("isAlertPresent", []) end # Has a prompt occurred? # # # This function never throws an exception # # # def is_prompt_present() return get_boolean("isPromptPresent", []) end # Has confirm() been called? # # # This function never throws an exception # # # def is_confirmation_present() return get_boolean("isConfirmationPresent", []) end # Retrieves the message of a JavaScript alert generated during the previous action, or fail if there were no alerts. # # Getting an alert has the same effect as manually clicking OK. If an # alert is generated but you do not get/verify it, the next Selenium action # will fail. # NOTE: under Selenium, JavaScript alerts will NOT pop up a visible alert # dialog. # NOTE: Selenium does NOT support JavaScript alerts that are generated in a # page's onload() event handler. In this case a visible dialog WILL be # generated and Selenium will hang until someone manually clicks OK. # # def get_alert() return get_string("getAlert", []) end # Retrieves the message of a JavaScript confirmation dialog generated during # the previous action. # # # By default, the confirm function will return true, having the same effect # as manually clicking OK. This can be changed by prior execution of the # chooseCancelOnNextConfirmation command. If an confirmation is generated # but you do not get/verify it, the next Selenium action will fail. # # # NOTE: under Selenium, JavaScript confirmations will NOT pop up a visible # dialog. # # # NOTE: Selenium does NOT support JavaScript confirmations that are # generated in a page's onload() event handler. In this case a visible # dialog WILL be generated and Selenium will hang until you manually click # OK. # # # def get_confirmation() return get_string("getConfirmation", []) end # Retrieves the message of a JavaScript question prompt dialog generated during # the previous action. # # Successful handling of the prompt requires prior execution of the # answerOnNextPrompt command. If a prompt is generated but you # do not get/verify it, the next Selenium action will fail. # NOTE: under Selenium, JavaScript prompts will NOT pop up a visible # dialog. # NOTE: Selenium does NOT support JavaScript prompts that are generated in a # page's onload() event handler. In this case a visible dialog WILL be # generated and Selenium will hang until someone manually clicks OK. # # def get_prompt() return get_string("getPrompt", []) end # Gets the absolute URL of the current page. # def get_location() return get_string("getLocation", []) end # Gets the title of the current page. # def get_title() return get_string("getTitle", []) end # Gets the entire text of the page. # def get_body_text() return get_string("getBodyText", []) end # Gets the (whitespace-trimmed) value of an input field (or anything else with a value parameter). # For checkbox/radio elements, the value will be "on" or "off" depending on # whether the element is checked or not. # # 'locator' is an element locator def get_value(locator) return get_string("getValue", [locator,]) end # Gets the text of an element. This works for any element that contains # text. This command uses either the textContent (Mozilla-like browsers) or # the innerText (IE-like browsers) of the element, which is the rendered # text shown to the user. # # 'locator' is an element locator def get_text(locator) return get_string("getText", [locator,]) end # Gets the result of evaluating the specified JavaScript snippet. The snippet may # have multiple lines, but only the result of the last line will be returned. # # Note that, by default, the snippet will run in the context of the "selenium" # object itself, so this will refer to the Selenium object, and window will # refer to the top-level runner test window, not the window of your application. # If you need a reference to the window of your application, you can refer # to this.browserbot.getCurrentWindow() and if you need to use # a locator to refer to a single element in your application page, you can # use this.page().findElement("foo") where "foo" is your locator. # # # 'script' is the JavaScript snippet to run def get_eval(script) return get_string("getEval", [script,]) end # Gets whether a toggle-button (checkbox/radio) is checked. Fails if the specified element doesn't exist or isn't a toggle-button. # # 'locator' is an element locator pointing to a checkbox or radio button def is_checked(locator) return get_boolean("isChecked", [locator,]) end # Gets the text from a cell of a table. The cellAddress syntax # tableLocator.row.column, where row and column start at 0. # # 'tableCellAddress' is a cell address, e.g. "foo.1.4" def get_table(tableCellAddress) return get_string("getTable", [tableCellAddress,]) end # Gets all option labels (visible text) for selected options in the specified select or multi-select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_labels(selectLocator) return get_string_array("getSelectedLabels", [selectLocator,]) end # Gets option label (visible text) for selected option in the specified select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_label(selectLocator) return get_string("getSelectedLabel", [selectLocator,]) end # Gets all option values (value attributes) for selected options in the specified select or multi-select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_values(selectLocator) return get_string_array("getSelectedValues", [selectLocator,]) end # Gets option value (value attribute) for selected option in the specified select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_value(selectLocator) return get_string("getSelectedValue", [selectLocator,]) end # Gets all option indexes (option number, starting at 0) for selected options in the specified select or multi-select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_indexes(selectLocator) return get_string_array("getSelectedIndexes", [selectLocator,]) end # Gets option index (option number, starting at 0) for selected option in the specified select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_index(selectLocator) return get_string("getSelectedIndex", [selectLocator,]) end # Gets all option element IDs for selected options in the specified select or multi-select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_ids(selectLocator) return get_string_array("getSelectedIds", [selectLocator,]) end # Gets option element ID for selected option in the specified select element. # # 'selectLocator' is an element locator identifying a drop-down menu def get_selected_id(selectLocator) return get_string("getSelectedId", [selectLocator,]) end # Determines whether some option in a drop-down menu is selected. # # 'selectLocator' is an element locator identifying a drop-down menu def is_something_selected(selectLocator) return get_boolean("isSomethingSelected", [selectLocator,]) end # Gets all option labels in the specified select drop-down. # # 'selectLocator' is an element locator identifying a drop-down menu def get_select_options(selectLocator) return get_string_array("getSelectOptions", [selectLocator,]) end # Gets the value of an element attribute. # # 'attributeLocator' is an element locator followed by an def get_attribute(attributeLocator) return get_string("getAttribute", [attributeLocator,]) end # Verifies that the specified text pattern appears somewhere on the rendered page shown to the user. # # 'pattern' is a pattern to match with the text of the page def is_text_present(pattern) return get_boolean("isTextPresent", [pattern,]) end # Verifies that the specified element is somewhere on the page. # # 'locator' is an element locator def is_element_present(locator) return get_boolean("isElementPresent", [locator,]) end # Determines if the specified element is visible. An # element can be rendered invisible by setting the CSS "visibility" # property to "hidden", or the "display" property to "none", either for the # element itself or one if its ancestors. This method will fail if # the element is not present. # # 'locator' is an element locator def is_visible(locator) return get_boolean("isVisible", [locator,]) end # Determines whether the specified input element is editable, ie hasn't been disabled. # This method will fail if the specified element isn't an input element. # # 'locator' is an element locator def is_editable(locator) return get_boolean("isEditable", [locator,]) end # Returns the IDs of all buttons on the page. # # If a given button has no ID, it will appear as "" in this array. # # def get_all_buttons() return get_string_array("getAllButtons", []) end # Returns the IDs of all links on the page. # # If a given link has no ID, it will appear as "" in this array. # # def get_all_links() return get_string_array("getAllLinks", []) end # Returns the IDs of all input fields on the page. # # If a given field has no ID, it will appear as "" in this array. # # def get_all_fields() return get_string_array("getAllFields", []) end # Returns the entire HTML source between the opening and # closing "html" tags. # def get_html_source() return get_string("getHtmlSource", []) end # Moves the text cursor to the specified position in the given input element or textarea. # This method will fail if the specified element isn't an input element or textarea. # # 'locator' is an element locator pointing to an input element or textarea # 'position' is the numerical position of the cursor in the field; position should be 0 to move the position to the beginning of the field. You can also set the cursor to -1 to move it to the end of the field. def set_cursor_position(locator,position) do_command("setCursorPosition", [locator,position,]) end # Retrieves the text cursor position in the given input element or textarea; beware, this may not work perfectly on all browsers. # # Specifically, if the cursor/selection has been cleared by JavaScript, this command will tend to # return the position of the last location of the cursor, even though the cursor is now gone from the page. This is filed as SEL-243. # # This method will fail if the specified element isn't an input element or textarea, or there is no cursor in the element. # # 'locator' is an element locator pointing to an input element or textarea def get_cursor_position(locator) return get_number("getCursorPosition", [locator,]) end # Writes a message to the status bar and adds a note to the browser-side # log. # # If logLevelThreshold is specified, set the threshold for logging # to that level (debug, info, warn, error). # (Note that the browser-side logs will not be sent back to the # server, and are invisible to the Client Driver.) # # # 'context' is the message to be sent to the browser # 'logLevelThreshold' is one of "debug", "info", "warn", "error", sets the threshold for browser-side logging def set_context(context,logLevelThreshold) do_command("setContext", [context,logLevelThreshold,]) end # Returns the specified expression. # # This is useful because of JavaScript preprocessing. # It is used to generate commands like assertExpression and waitForExpression. # # # 'expression' is the value to return def get_expression(expression) return get_string("getExpression", [expression,]) end # Runs the specified JavaScript snippet repeatedly until it evaluates to "true". # The snippet may have multiple lines, but only the result of the last line # will be considered. # # Note that, by default, the snippet will be run in the runner's test window, not in the window # of your application. To get the window of your application, you can use # the JavaScript snippet selenium.browserbot.getCurrentWindow(), and then # run your JavaScript in there # # # 'script' is the JavaScript snippet to run # 'timeout' is a timeout in milliseconds, after which this command will return with an error def wait_for_condition(script,timeout) do_command("waitForCondition", [script,timeout,]) end # Specifies the amount of time that Selenium will wait for actions to complete. # # Actions that require waiting include "open" and the "waitFor*" actions. # # The default timeout is 30 seconds. # # 'timeout' is a timeout in milliseconds, after which the action will return with an error def set_timeout(timeout) do_command("setTimeout", [timeout,]) end # Waits for a new page to load. # # You can use this command instead of the "AndWait" suffixes, "clickAndWait", "selectAndWait", "typeAndWait" etc. # (which are only available in the JS API). # Selenium constantly keeps track of new pages loading, and sets a "newPageLoaded" # flag when it first notices a page load. Running any other Selenium command after # turns the flag to false. Hence, if you want to wait for a page to load, you must # wait immediately after a Selenium command that caused a page-load. # # # 'timeout' is a timeout in milliseconds, after which this command will return with an error def wait_for_page_to_load(timeout) do_command("waitForPageToLoad", [timeout,]) end end end class SeleniumCommandError < RuntimeError end