Created new classes to represent a web driver.

Added Examples, clean code
This commit is contained in:
jvelilla
2013-04-29 18:02:33 -03:00
parent 9180667ac4
commit 31c2be768f
15 changed files with 1012 additions and 48 deletions

View File

@@ -0,0 +1,27 @@
note
description : "project application root class"
date : "$Date$"
revision : "$Revision$"
class
APPLICATION
inherit
ARGUMENTS
create
make
feature {NONE} -- Initialization
make
-- Run application.
do
execute_example1
end
execute_example1
do
(create {EXAMPLE_1}).test
end
end

View File

@@ -0,0 +1,58 @@
note
description: "Summary description for {EXAMPLE_1}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
EXAMPLE_1
feature -- Access
test
local
web_driver: SE_JSON_WIRE_PROTOCOL
capabilities: SE_CAPABILITIES
l_session : SE_SESSION
do
create web_driver.make
if attached web_driver.status as l_status then
create capabilities.make
capabilities.set_browser_name ("chrome")
l_session:= web_driver.create_session_with_desired_capabilities (capabilities)
if attached l_session as l_s then
-- navigate to www.google.com
web_driver.navigate_to_url (l_s.session_id, "http://www.google.com/")
-- Find the text input element by its name
if attached {WEB_ELEMENT} web_driver.search_element (l_s.session_id, (create {SE_BY}).name ("q")) as l_element then
-- search something
web_driver.send_event(l_s.session_id, l_element.element,<<"Eiffel Room">>)
-- Submit Form
web_driver.element_submit (l_s.session_id, l_element.element)
if attached web_driver.page_title (l_s.session_id) as l_page then
print ("Page Name" + l_page)
end
end
end
end
end
-- // And now use this to visit Google
-- driver.get("http://www.google.com");
-- // Find the text input element by its name
-- WebElement element = driver.findElement(By.name("q"));
-- // Enter something to search for
-- element.sendKeys("Cheese!");
-- // Now submit the form. WebDriver will find the form for us from the element
-- element.submit();
-- // Check the title of the page
-- System.out.println("Page title is: " + driver.getTitle());
end

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-5-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-5-0 http://www.eiffel.com/developers/xml/configuration-1-5-0.xsd" name="project" uuid="61EFD50A-C916-494A-91D6-3E12E0738F4D">
<target name="project">
<root feature="make" class="APPLICATION"/>
<option warning="true">
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
</option>
<setting name="console_application" value="true"/>
<library name="selenium" location="..\selenium-safe.ecf"/>
<library name="base" location="$ISE_LIBRARY/library/base/base-safe.ecf"/>
<cluster name="project" location=".\" recursive="true">
<file_rule>
<exclude>/EIFGENs$</exclude>
<exclude>/.svn$</exclude>
<exclude>/CVS$</exclude>
</file_rule>
</cluster>
</target>
</system>

View File

@@ -0,0 +1,37 @@
note
description: "Summary description for {ENUM}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
ENUM
feature -- Access
is_valid_state: BOOLEAN
-- Is the value of the enumeration valid?
do
Result := is_valid_value (value)
end
value: INTEGER
-- The current value of the enumeration.
set_value (a_value: INTEGER)
require
is_valid_value (a_value)
do
value := a_value
end
is_valid_value (a_value: INTEGER): BOOLEAN
-- Can `a_value' be used in a `set_value' feature call?
deferred
end
invariant
is_valid_state
end -- class ENUM

View File

@@ -202,22 +202,24 @@ feature -- Commands
Result := new_response (a_session_id, resp)
end
execute
execute (a_session_id : STRING_32; data : STRING_32) : SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
-- TODO
resp := execute_post (cmd_session_execute (a_session_id), data)
Result := new_response (a_session_id, resp)
end
execute_async
execute_async (a_session_id : STRING_32; data : STRING_32) : SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
-- TODO
resp := execute_post (cmd_session_execute_async (a_session_id),data)
Result := new_response (a_session_id, resp)
end
screenshot (session_id: STRING_32): SE_RESPONSE
@@ -280,6 +282,17 @@ feature -- Commands
Result := new_response (a_session_id, resp)
end
frame (a_session_id: STRING_32; a_data: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
resp := execute_post (cmd_session_frame (a_session_id), a_data)
Result := new_response (a_session_id, resp)
end
change_focus_window (a_session_id: STRING_32; a_data: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available

View File

@@ -576,7 +576,7 @@ feature -- Commands
end
end
frame (a_session_id: STRING_32)
frame (a_session_id: STRING_32; arg : detachable STRING_32)
-- POST /session/:sessionId/frame
-- Change focus to another frame on the page. If the frame id is null, the server should switch to the page's default content.
-- URL Parameters:
@@ -586,7 +586,23 @@ feature -- Commands
-- Potential Errors:
-- NoSuchWindow - If the currently selected window has been closed.
-- NoSuchFrame - If the frame specified by id cannot be found.
local
l_json: STRING_32
resp: SE_RESPONSE
do
l_json := "[
{ "id": $id }
]"
if attached arg as l_arg then
l_json.replace_substring_all ("$id", l_arg)
else
l_json.replace_substring_all ("$id", "null")
end
if commnad_executor.is_available then
resp := commnad_executor.frame (a_session_id, l_json)
check_response (resp)
end
end
change_focus_window (a_session_id: STRING_32; a_name: STRING_32)
@@ -653,7 +669,7 @@ feature -- Commands
end
end
size_window (a_session_id: STRING_32; a_window_handle: STRING_32): SE_WINDOW
size_window (a_session_id: STRING_32; a_window_handle: STRING_32): SE_DIMENSION
-- GET /session/:sessionId/window/:windowHandle/size
-- Get the size of the specified window. If the :windowHandle URL parameter is "current", the size of the currently active window will be returned.
-- URL Parameters:
@@ -709,7 +725,7 @@ feature -- Commands
end
end
window_position (a_session_id: STRING_32; a_window_handle: STRING_32): SE_WINDOW
window_position (a_session_id: STRING_32; a_window_handle: STRING_32): SE_POINT
-- GET /session/:sessionId/window/:windowHandle/position
-- Get the position of the specified window. If the :windowHandle URL parameter is "current", the position of the currently active window will be returned.
-- URL Parameters:
@@ -931,8 +947,8 @@ feature -- Commands
resp := commnad_executor.search_element (a_session_id, strategy)
check_response (resp)
if not has_error then
if attached {JSON_OBJECT} resp.value as l_value and then attached l_value.item ("ELEMENT") as l_elem then
create Result.make (l_elem.representation)
if attached resp.value as l_value and then attached {JSON_OBJECT} string_to_json (l_value) as ll_value and then attached {JSON_STRING} ll_value.item ("ELEMENT") as l_elem then
create Result.make (l_elem.item)
end
end
end
@@ -1437,7 +1453,7 @@ feature -- Commands
end
end
element_location (a_session_id: STRING_32; an_id: STRING_32): SE_WINDOW
element_location (a_session_id: STRING_32; an_id: STRING_32): SE_POINT
-- GET /session/:sessionId/element/:id/location
-- Determine an element's location on the page. The point (0, 0) refers to the upper-left corner of the page.
-- The element's coordinates are returned as a JSON object with x and y properties.
@@ -1469,7 +1485,7 @@ feature -- Commands
end
end
location_in_view (a_session_id: STRING_32; an_id: STRING_32): SE_WINDOW
location_in_view (a_session_id: STRING_32; an_id: STRING_32): SE_POINT
-- GET /session/:sessionId/element/:id/location_in_view
-- Determine an element's location on the screen once it has been scrolled into view.
-- Note: This is considered an internal command and should only be used to determine an element's
@@ -1502,7 +1518,7 @@ feature -- Commands
end
end
element_size (a_session_id: STRING_32; an_id: STRING_32): SE_WINDOW
element_size (a_session_id: STRING_32; an_id: STRING_32): SE_DIMENSION
-- GET /session/:sessionId/element/:id/size
-- Determine an element's size in pixels. The size will be returned as a JSON object with width and height properties.
-- URL Parameters:
@@ -1632,7 +1648,7 @@ feature -- Commands
end
end
send_alert_text (a_session_id: STRING_32)
send_alert_text (a_session_id: STRING_32; text : STRING_32)
-- POST /session/:sessionId/alert_text
-- Sends keystrokes to a JavaScript prompt() dialog.
-- URL Parameters:
@@ -1641,7 +1657,19 @@ feature -- Commands
-- text - {string} Keystrokes to send to the prompt() dialog.
-- Potential Errors:
-- NoAlertPresent - If there is no alert displayed.
local
resp : SE_RESPONSE
l_json : STRING_32
do
l_json := "[
{ "text":"$text" }
]"
if commnad_executor.is_available then
l_json.replace_substring_all ("$text", text)
resp := commnad_executor.send_alert_text (a_session_id, l_json)
check_response (resp)
end
end
accept_alert (a_session_id: STRING_32)
@@ -1651,7 +1679,13 @@ feature -- Commands
-- :sessionId - ID of the session to route the command to.
-- Potential Errors:
-- NoAlertPresent - If there is no alert displayed.
local
resp : SE_RESPONSE
do
if commnad_executor.is_available then
resp := commnad_executor.accept_alert (a_session_id)
check_response (resp)
end
end
dismiss_alert (a_session_id: STRING_32)
@@ -1661,57 +1695,131 @@ feature -- Commands
-- :sessionId - ID of the session to route the command to.
-- Potential Errors:
-- NoAlertPresent - If there is no alert displayed.
local
resp : SE_RESPONSE
do
if commnad_executor.is_available then
resp := commnad_executor.dismiss_alert (a_session_id)
check_response (resp)
end
end
move_to (a_session_id: STRING_32)
move_to (a_session_id: STRING_32; web_element : WEB_ELEMENT; xoffset : NATURAL; yoffset:NATURAL)
-- POST /session/:sessionId/moveto
-- Move the mouse by an offset of the specificed element. If no element is specified, the move is relative to the current mouse cursor. If an element is provided but no offset, the mouse will be moved to the center of the element. If the element is not visible, it will be scrolled into view.
-- Move the mouse by an offset of the specificed element.
-- If no element is specified, the move is relative to the current mouse cursor.
-- If an element is provided but no offset, the mouse will be moved to the center of the element.
-- If the element is not visible, it will be scrolled into view.
-- URL Parameters:
-- :sessionId - ID of the session to route the command to.
-- JSON Parameters:
-- element - {string} Opaque ID assigned to the element to move to, as described in the WebElement JSON Object. If not specified or is null, the offset is relative to current position of the mouse.
-- xoffset - {number} X offset to move to, relative to the top-left corner of the element. If not specified, the mouse will move to the middle of the element.
-- yoffset - {number} Y offset to move to, relative to the top-left corner of the element. If not specified, the mouse will move to the middle of the element.
local
resp : SE_RESPONSE
l_json : STRING_32
do
l_json := "[
{ "element" : "$element",
"yoffset" : $yoffset,
"xoffset" : $xoffset
}
]"
if commnad_executor.is_available then
l_json.replace_substring_all ("$element", web_element.element)
l_json.replace_substring_all ("$yoffset", yoffset.out)
l_json.replace_substring_all ("$xoffset", xoffset.out)
resp := commnad_executor.move_to (a_session_id, l_json)
check_response (resp)
end
end
click (a_session_id: STRING_32)
click (a_session_id: STRING_32; button : SE_BUTTON )
-- POST /session/:sessionId/click
-- Click any mouse button (at the coordinates set by the last moveto command). Note that calling this command after calling buttondown and before calling button up (or any out-of-order interactions sequence) will yield undefined behaviour).
-- URL Parameters:
-- :sessionId - ID of the session to route the command to.
-- JSON Parameters:
-- button - {number} Which button, enum: {LEFT = 0, MIDDLE = 1 , RIGHT = 2}. Defaults to the left mouse button if not specified.
local
resp : SE_RESPONSE
l_json : STRING_32
do
l_json := "[
{
"button" : $number
}
]"
if commnad_executor.is_available then
l_json.replace_substring_all ("$number", button.value.out)
resp := commnad_executor.click (a_session_id, l_json)
check_response (resp)
end
end
button_down (a_session_id: STRING_32)
button_down (a_session_id: STRING_32; button : SE_BUTTON)
-- POST /session/:sessionId/buttondown
-- Click and hold the left mouse button (at the coordinates set by the last moveto command). Note that the next mouse-related command that should follow is buttonup . Any other mouse command (such as click or another call to buttondown) will yield undefined behaviour.
-- Click and hold the left mouse button (at the coordinates set by the last moveto command).
-- Note that the next mouse-related command that should follow is buttonup .
-- Any other mouse command (such as click or another call to buttondown) will yield undefined behaviour.
-- URL Parameters:
-- :sessionId - ID of the session to route the command to.
-- JSON Parameters:
-- button - {number} Which button, enum: {LEFT = 0, MIDDLE = 1 , RIGHT = 2}. Defaults to the left mouse button if not specified.
-- button - {number} Which button, enum: {LEFT = 0, MIDDLE = 1 , RIGHT = 2}.
-- Defaults to the left mouse button if not specified.
local
resp : SE_RESPONSE
l_json : STRING_32
do
l_json := "[
{
"button" : $number
}
]"
if commnad_executor.is_available then
l_json.replace_substring_all ("$number", button.value.out)
resp := commnad_executor.button_down (a_session_id, l_json)
check_response (resp)
end
end
button_up (a_session_id: STRING_32)
button_up (a_session_id: STRING_32; button : SE_BUTTON)
-- POST /session/:sessionId/buttonup
-- Releases the mouse button previously held (where the mouse is currently at). Must be called once for every buttondown command issued. See the note in click and buttondown about implications of out-of-order commands.
-- URL Parameters:
-- :sessionId - ID of the session to route the command to.
-- JSON Parameters:
-- button - {number} Which button, enum: {LEFT = 0, MIDDLE = 1 , RIGHT = 2}. Defaults to the left mouse button if not specified.
-- button - {number} Which button, enum: {LEFT = 0, MIDDLE = 1 , RIGHT = 2}.
-- Defaults to the left mouse button if not specified.
local
resp : SE_RESPONSE
l_json : STRING_32
do
l_json := "[
{
"button" : $number
}
]"
if commnad_executor.is_available then
l_json.replace_substring_all ("$number", button.value.out)
resp := commnad_executor.button_up (a_session_id, l_json)
check_response (resp)
end
end
double_click (a_session_id: STRING_32)
-- POST /session/:sessionId/doubleclick
-- Double-clicks at the current mouse coordinates (set by moveto).
-- URL Parameters:
-- :sessionId - ID of the session to route the command to.
local
resp : SE_RESPONSE
do
if commnad_executor.is_available then
resp := commnad_executor.double_click (a_session_id)
check_response (resp)
end
end
touch_click (a_session_id: STRING_32)

View File

@@ -103,8 +103,21 @@ feature
Result.replace_substring_all ("$id", id)
end
--POST /session/:sessionId/execute Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame.
--POST /session/:sessionId/execute_async Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame.
cmd_session_execute_tmpl: STRING = "session/$id/execute"
cmd_session_execute (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_execute_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_execute_async_tmpl: STRING = "session/$id/execute_async"
cmd_session_execute_async (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_execute_async_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_screenshot_tmpl: STRING = "session/$id/screenshot"
@@ -156,6 +169,15 @@ feature
--POST /session/:sessionId/frame Change focus to another frame on the page.
cmd_session_frame_tmpl: STRING = "session/$id/frame"
cmd_session_frame (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_frame_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_window_tmpl: STRING = "session/$id/window"
cmd_session_window (id: STRING_32): STRING_32
@@ -220,7 +242,7 @@ feature
cmd_session_title (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_source_tmpl)
create Result.make_from_string (cmd_session_title_tmpl)
Result.replace_substring_all ("$id", id)
end
@@ -611,7 +633,7 @@ feature
cmd_session_storage_size_tmpl: STRING = "session/$sessionId/session_storage/size"
cmd_session_storage_size (sessionId: STRING_32; key : STRING_32): STRING_32
cmd_session_storage_size (sessionId: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_storage_size_tmpl)
Result.replace_substring_all ("$sessionId", sessionId)

View File

@@ -0,0 +1,95 @@
note
description: "Summary description for {SE_BUTTON}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
SE_BUTTON
inherit {NONE}
ENUM
create
make_left,
make_middle,
make_right
feature -- Initialization
make_left
do
set_left
end
make_middle
do
set_middle
end
make_right
do
set_right
end
feature -- Access
is_valid_value (a_value: INTEGER): BOOLEAN
-- Can `a_value' be used in a `set_value' feature call?
do
Result := (a_value = left_value) or else
(a_value = middle_value) or else
(a_value = right_value)
end
feature -- Element Change
set_left
do
value := left_value
end
set_middle
do
value := middle_value
end
set_right
do
value := right_value
end
feature -- Query
is_left : BOOLEAN
-- is the current value left?
do
Result := (value = left_value)
end
is_middle : BOOLEAN
-- is the current value middle?
do
Result := (value = middle_value)
end
is_right : BOOLEAN
-- is the current value right?
do
Result := (value = right_value)
end
feature {NONE} -- Implementation
-- {LEFT = 0, MIDDLE = 1 , RIGHT = 2}
left_value :INTEGER = 0
middle_value : INTEGER = 1
right_value : INTEGER = 2
end

View File

@@ -13,7 +13,7 @@ inherit
create default_create
feature -- Access
id (an_id : STRING_32; value : STRING_32 ) : STRING_32
id ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `id' and value `value'
-- { "using" : "id", "value":value }
@@ -25,7 +25,7 @@ feature -- Access
has_id_strategy : has_correct_stategy (Result, se_id)
end
name (an_id : STRING_32; value : STRING_32 ) : STRING_32
name ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `name' and value `value'
-- { "using" : "name", "value":value }
@@ -37,7 +37,7 @@ feature -- Access
has_name_strategy : has_correct_stategy (Result, se_name)
end
class_name (an_id : STRING_32; value : STRING_32 ) : STRING_32
class_name ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `class name' and value `value'
-- { "using" : "class name", "value":value }
@@ -50,7 +50,7 @@ feature -- Access
end
css_selector (an_id : STRING_32; value : STRING_32 ) : STRING_32
css_selector ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `css selector' and value `value'
-- { "using" : "css selector", "value":value }
@@ -62,7 +62,7 @@ feature -- Access
has_css_selector_strategy : has_correct_stategy (Result, se_css_selector)
end
link_text (an_id : STRING_32; value : STRING_32 ) : STRING_32
link_text ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `link text' and value `value'
-- { "using" : "link text", "value":value }
@@ -75,7 +75,7 @@ feature -- Access
end
partial_link_text (an_id : STRING_32; value : STRING_32 ) : STRING_32
partial_link_text ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `partial link text' and value `value'
-- { "using" : "partial link text", "value":value }
@@ -87,7 +87,7 @@ feature -- Access
has_partial_link_text_strategy : has_correct_stategy (Result, se_partial_link_text)
end
tag_name (an_id : STRING_32; value : STRING_32 ) : STRING_32
tag_name ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `tag name' and value `value'
-- { "using" : "tag name", "value":value }
@@ -100,7 +100,7 @@ feature -- Access
end
xpath (an_id : STRING_32; value : STRING_32 ) : STRING_32
xpath ( value : STRING_32 ) : STRING_32
-- return a STRING representing a JSON
-- with strategy by `xpath' and value `value'
-- { "using" : "xpath", "value":value }

View File

@@ -1,5 +1,5 @@
note
description: "bject that describe a cookie. When returning Cookie objects, the server should only omit an optional field if it is incapable of providing the information."
description: "Objects that describe a cookie. When returning Cookie objects, the server should only omit an optional field if it is incapable of providing the information."
author: ""
date: "$Date$"
revision: "$Revision$"

View File

@@ -1,11 +1,11 @@
note
description: "Summary description for {SE_WINDOW}."
description: "Summary description for {SE_DIMENSION}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
SE_WINDOW
SE_DIMENSION
create
default_create,
make_with_values
@@ -24,8 +24,6 @@ feature -- Access
height : NATURAL_32
-- The width and height of the element, in pixels.
x,y : INTEGER_32
-- The X and Y coordinates for the element.
feature -- Change Element
set_width (a_width : NATURAL_32)
@@ -41,14 +39,6 @@ feature -- Change Element
height := a_height
end
set_x (an_x : INTEGER_32)
do
x := an_x
end
set_y (an_y : INTEGER_32)
do
y := an_y
end
end

View File

@@ -0,0 +1,41 @@
note
description: "Summary description for {SE_POINT}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
SE_POINT
create
default_create,
make_with_values
feature -- Initialization
make_with_values (new_x : INTEGER_32; new_y : INTEGER_32)
do
set_x (new_x)
set_y (new_y)
end
feature -- Access
x : INTEGER_32
y : INTEGER_32
-- The X and Y coordinates for the element.
feature -- Change Element
set_x (an_x : INTEGER_32)
do
x := an_x
end
set_y (an_y : INTEGER_32)
do
y := an_y
end
end

View File

@@ -0,0 +1,444 @@
note
description: "Objects that represent a Web Browser"
author: ""
date: "$Date$"
revision: "$Revision$"
class
WEB_DRIVER
inherit {NONE}
SE_JSON_WIRE_PROTOCOL
rename
back as se_back,
forward as se_forward,
refresh as se_refresh,
window_position as se_window_position,
window_maximize as se_window_maximize
export
{NONE} all
end
create {SE_JSON_WIRE_PROTOCOL}
make, make_with_host
feature -- Initialize Session
start_session_firefox
local
l_capabilities: SE_CAPABILITIES
do
create l_capabilities.make
l_capabilities.set_browser_name ("firefox")
session := create_session_with_desired_capabilities (l_capabilities)
end
start_session_firefox_with_desired_capabilities (a_desired_capabilities: SE_CAPABILITIES)
require
browser_name_firefox: attached a_desired_capabilities.browser_name as l_browser_name and then l_browser_name ~ "firefox"
do
session := create_session_with_desired_capabilities (a_desired_capabilities)
end
start_session_chrome
local
l_capabilities: SE_CAPABILITIES
do
create l_capabilities.make
l_capabilities.set_browser_name ("chrome")
session := create_session_with_desired_capabilities (l_capabilities)
end
start_session_chrome_with_desired_capabilities (a_desired_capabilities: SE_CAPABILITIES)
require
browser_name_chrome: attached a_desired_capabilities.browser_name as l_browser_name and then l_browser_name ~ "chrome"
do
session := create_session_with_desired_capabilities (a_desired_capabilities)
end
start_session_ie
local
l_capabilities: SE_CAPABILITIES
do
create l_capabilities.make
l_capabilities.set_browser_name ("internet explorer")
session := create_session_with_desired_capabilities (l_capabilities)
end
start_session_ie_with_desired_capabilities (a_desired_capabilities: SE_CAPABILITIES)
require
browser_name_chrome: attached a_desired_capabilities.browser_name as l_browser_name and then l_browser_name ~ "internet explorer"
do
session := create_session_with_desired_capabilities (a_desired_capabilities)
end
--|TODO add create session with desired and required capabilities
--| add other drivers.
--| think about pre and postconditions
feature -- Query
is_session_active: BOOLEAN
-- exist a valid session?
do
Result := attached session
end
feature -- Ime Handler
activate_engine (engine: STRING_32)
-- Make an engines that is available (appears on the list returned by getAvailableEngines) active.
require
exist_session: is_session_active
do
if attached session as l_session then
ime_activate (l_session.session_id, engine)
end
end
deactivate
-- De-activates the currently-active IME engine.
require
exist_session: is_session_active
do
if attached session as l_session then
ime_deactivate (l_session.session_id)
end
end
available_engines: detachable LIST [STRING_32]
-- List all available engines on the machine. To use an engine, it has to be present in this list.
require
exist_session: is_session_active
do
if attached session as l_session then
Result := ime_available_engines (l_session.session_id)
end
end
is_activated: BOOLEAN
require
exist_session: is_session_active
do
if attached session as l_session then
Result := ime_activated (l_session.session_id)
end
end
feature -- Navigation
back
-- Navigate backwards in the browser history, if possible.
require
exist_session: is_session_active
do
if attached session as l_session then
se_back (l_session.session_id)
end
end
forward
-- Navigate forwards in the browser history, if possible.
require
exist_session: is_session_active
do
if attached session as l_session then
se_forward (l_session.session_id)
end
end
refresh
--
require
exist_session: is_session_active
do
if attached session as l_session then
se_refresh (l_session.session_id)
end
end
to_url (an_url: STRING_32)
-- Navigate to a new URL.
require
exist_session: is_session_active
do
if attached session as l_session then
navigate_to_url (l_session.session_id, an_url)
end
end
feature -- Options
-- Stuff you would do in a browser menu
add_cookie (cookie: SE_COOKIE)
-- Set a cookie. If the cookie path is not specified, it should be set to "/".
-- Likewise, if the domain is omitted, it should default to the current page's domain.
require
exist_session: is_session_active
do
if attached session as l_session then
set_cookie (l_session.session_id, cookie)
end
end
delete_all_cookies
-- Delete all cookies visible to the current page.
require
exist_session: is_session_active
do
if attached session as l_session then
delete_cookies (l_session.session_id)
end
end
delete_cookie (cookie: SE_COOKIE)
-- Delete the cookie with the given name.
-- This command should be a no-op if there is no such cookie visible to the current page.
require
exist_session: is_session_active
do
if attached session as l_session and then attached cookie.name as l_name then
delete_cookie_by_name (l_session.session_id, l_name)
end
end
get_cookies: detachable LIST [SE_COOKIE]
-- Retrieve all cookies visible to the current page.
require
exist_session: is_session_active
do
if attached session as l_session then
Result := retrieve_cookies (l_session.session_id)
end
end
get_cookie (name: STRING_32): detachable SE_COOKIE
-- Get a cookie with a given name
require
exist_session: is_session_active
local
found: BOOLEAN
do
if attached session as l_session then
if attached retrieve_cookies (l_session.session_id) as l_list then
from
l_list.start
until
l_list.after or found
loop
if attached l_list.item.name as l_name and then l_name.is_case_insensitive_equal (name) then
found := true
Result := l_list.item
end
l_list.forth
end
end
end
end
feature -- Target Locator
active_element: detachable WEB_ELEMENT
require
exist_session: is_session_active
do
if attached session as l_session then
Result := element_active (l_session.session_id)
end
end
default_content
-- The server switch to the page's default content.
require
exist_session: is_session_active
do
if attached session as l_session then
frame (l_session.session_id, Void)
end
end
frame_by_index (index: INTEGER)
-- Select a frame by index `index'
require
exist_session: is_session_active
do
if attached session as l_session then
frame (l_session.session_id, index.out)
end
end
frame_by_name (name: STRING_32)
-- Select a frame by name `name'
require
exist_session: is_session_active
do
if attached session as l_session then
frame (l_session.session_id, name)
end
end
frame_by_web_element (element: WEB_ELEMENT)
-- Select a frame by name `name'
require
exist_session: is_session_active
do
if attached session as l_session then
frame (l_session.session_id, element.element)
end
end
window (name: STRING_32)
-- Change focus to another window.
-- The window to change focus to may be specified by its server assigned window handle, or by the value of its name attribute.
require
exist_session: is_session_active
do
if attached session as l_session then
change_focus_window (l_session.session_id, name)
end
end
feature -- Window
window_position: SE_POINT
-- Get the position of the current window.
require
exist_session: is_session_active
do
create Result
if attached session as l_session then
Result := se_window_position (l_session.session_id, "current")
end
end
window_size: SE_DIMENSION
--Get the size of the current window.
require
exist_session: is_session_active
do
create Result
if attached session as l_session then
Result := size_window (l_session.session_id, "current")
end
end
window_maximize
--Maximizes the current window if it is not already maximized
require
exist_session: is_session_active
do
if attached session as l_session then
se_window_maximize (l_session.session_id, "current")
end
end
set_window_position (target_position: SE_POINT)
-- Set the position of the current window.
require
exist_session: is_session_active
do
if attached session as l_session then
change_window_position (l_session.session_id, "current", target_position.x, target_position.y)
end
end
set_window_size (target_size: SE_DIMENSION)
--Set the size of the current window.
require
exist_session: is_session_active
do
if attached session as l_session then
change_size_window (l_session.session_id, "current", target_size.width, target_size.height)
end
end
feature -- Common
window_close
--Close the current window, quitting the browser if it's the last window currently open.
require
exist_session: is_session_active
do
if attached session as l_session then
close_window (l_session.session_id)
end
end
find_element (by: SE_BY) : detachable WEB_ELEMENT
-- Find the first WebElement using the given strategy.
require
exist_session : is_session_active
do
if attached session as l_session then
end
end
find_elements (by: SE_BY) : detachable LIST[WEB_ELEMENT]
-- Find all elements within the current page using the given mechanism..
require
exist_session : is_session_active
do
if attached session as l_session then
end
end
get_current_url : detachable STRING_32
-- Retrieve the URL of the current page.
require
exist_session : is_session_active
do
if attached session as l_session then
Result := retrieve_url (l_session.session_id)
end
end
get_page_source : detachable STRING_32
-- Get the current page source.
require
exist_session : is_session_active
do
if attached session as l_session then
Result := page_source (l_session.session_id)
end
end
get_page_tile : detachable STRING_32
--Get the current page title
require
exist_session : is_session_active
do
if attached session as l_session then
Result := page_title (l_session.session_id)
end
end
get_window_handle : detachable STRING_32
require
exist_session : is_session_active
do
if attached session as l_session then
Result := retrieve_window_handle (l_session.session_id)
end
end
get_window_handles : detachable LIST[STRING_32]
require
exist_session : is_session_active
do
if attached session as l_session then
Result := retrieve_window_handles (l_session.session_id)
end
end
feature {NONE} -- Implementation
session: detachable SE_SESSION
end

View File

@@ -7,11 +7,20 @@ note
class
WEB_ELEMENT
create
make
make,
make2
feature
make2 ( an_element : STRING_32 ; an_api : like api; a_session_id : STRING_32)
do
set_element (an_element)
api := an_api
session_id := a_session_id
end
make ( an_element : STRING_32)
do
set_element (an_element)
create api.make
session_id := ""
end
feature -- Access
element : STRING_32
@@ -23,4 +32,102 @@ feature -- Change Element
do
element := an_element
end
feature -- Web Element API
clear
-- Clear a TEXTAREA or text INPUT element's value.
do
api.clear_element (session_id, element)
end
click
-- Click on an element.
do
api.element_click (session_id, element)
end
find_element (by : SE_BY) : detachable WEB_ELEMENT
-- Find the first WebElement using the given method.
do
Result := api.search_element (session_id,"")
end
find_elementS (by : SE_BY) : detachable LIST[WEB_ELEMENT]
-- Find all elements within the current context using the given mechanism.
do
Result := api.search_elements (session_id,"")
end
get_attribute (name : STRING_32) : detachable STRING_32
-- Get the value of an element's attribute.
do
Result := api.element_value (session_id, element, name)
end
get_css_value (name : STRING_32) : detachable STRING_32
-- Get the value of an element's attribute.
do
Result := api.element_css_value (session_id, element, name)
end
get_location : SE_POINT
-- Determine an element's location on the page. The point (0, 0) refers to the upper-left corner of the page.
do
Result := api.element_location (session_id, element)
end
get_size : SE_DIMENSION
-- Determine an element's size in pixels. The size will be returned as a JSON object with width and height properties.
do
Result := api.element_size (session_id, element)
end
get_tag_name : detachable STRING_32
-- The element's tag name, as a lowercase string.
do
Result := api.query_by_tag_name (session_id, element)
end
get_text : detachable STRING_32
-- Returns the visible text for the element.
do
Result := api.element_text (session_id, element)
end
is_displayed : BOOLEAN
-- Determine if an element is currently displayed.
do
Result := api.is_displayed (session_id, element)
end
is_enabled : BOOLEAN
-- Determine if an element is currently enabled.
do
Result := api.is_enabled (session_id, element)
end
is_selected : BOOLEAN
-- Determine if an OPTION element, or an INPUT element of type checkbox or radiobutton is currently selected.
do
Result := api.is_selected (session_id, element)
end
send_keys (keys : ARRAY[STRING_32])
-- Send a sequence of key strokes to an element.
do
api.send_event (session_id, element, keys)
end
submit
-- Submit a FORM element. The submit command may also be applied to any element that is a descendant of a FORM element.
do
api.element_submit (session_id, element)
end
feature {NONE} -- Implementation
api : SE_JSON_WIRE_PROTOCOL
session_id : STRING_32
end

View File

@@ -115,6 +115,7 @@ feature {NONE} -- Initialization
print ("The selenium server is not accesible")
end
end
test_back_forward_refesh
local
web_driver: SE_JSON_WIRE_PROTOCOL
@@ -184,6 +185,8 @@ feature {NONE} -- Initialization
end
end
end
test_session
local
h: LIBCURL_HTTP_CLIENT