Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Fukász Rómeó Ervin
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
d6304178
authored
Apr 01, 2015
by
Csók Tamás
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
selenium: corrections and stability improvements
parent
01890687
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
92 additions
and
36 deletions
+92
-36
circle/dashboard/tests/selenium/config.py
+1
-1
circle/dashboard/tests/selenium/util.py
+91
-35
No files found.
circle/dashboard/tests/selenium/config.py
View file @
d6304178
...
@@ -50,7 +50,7 @@ class SeleniumConfig:
...
@@ -50,7 +50,7 @@ class SeleniumConfig:
client_name
=
'test_
%
s'
%
random_pass
client_name
=
'test_
%
s'
%
random_pass
# Which webpage should selenium use (localhost is recommended)
# Which webpage should selenium use (localhost is recommended)
host
=
'https:127.0.0.1'
host
=
'https:
//
127.0.0.1'
# In default the tests create a new user then delete it afteword
# In default the tests create a new user then delete it afteword
# Disable this if selenium cannot acces the database
# Disable this if selenium cannot acces the database
create_user
=
True
create_user
=
True
...
...
circle/dashboard/tests/selenium/util.py
View file @
d6304178
...
@@ -23,7 +23,8 @@ import re
...
@@ -23,7 +23,8 @@ import re
import
time
import
time
import
urlparse
import
urlparse
from
selenium.common.exceptions
import
NoSuchElementException
from
selenium.common.exceptions
import
(
NoSuchElementException
,
StaleElementReferenceException
)
from
selenium.webdriver.common.by
import
By
from
selenium.webdriver.common.by
import
By
from
selenium.webdriver.support
import
expected_conditions
as
ec
from
selenium.webdriver.support
import
expected_conditions
as
ec
from
selenium.webdriver.support.select
import
Select
from
selenium.webdriver.support.select
import
Select
...
@@ -112,7 +113,8 @@ class CircleSeleniumMixin(object):
...
@@ -112,7 +113,8 @@ class CircleSeleniumMixin(object):
self
.
wait_and_accept_operation
()
self
.
wait_and_accept_operation
()
recent_deploy
=
self
.
recently
(
self
.
get_timeline_elements
(
recent_deploy
=
self
.
recently
(
self
.
get_timeline_elements
(
"vm.Instance.deploy"
))
"vm.Instance.deploy"
))
if
not
self
.
check_operation_result
(
recent_deploy
):
if
not
self
.
check_operation_result
(
recent_deploy
,
"a[href*='#activity']"
):
logger
.
warning
(
"Selenium cannot deploy the "
logger
.
warning
(
"Selenium cannot deploy the "
"chosen template virtual machine"
)
"chosen template virtual machine"
)
raise
Exception
(
'Cannot deploy the virtual machine'
)
raise
Exception
(
'Cannot deploy the virtual machine'
)
...
@@ -122,9 +124,13 @@ class CircleSeleniumMixin(object):
...
@@ -122,9 +124,13 @@ class CircleSeleniumMixin(object):
By
.
CSS_SELECTOR
,
By
.
CSS_SELECTOR
,
"a[href$='/op/shut_off/']"
))))
"a[href$='/op/shut_off/']"
))))
self
.
wait_and_accept_operation
()
self
.
wait_and_accept_operation
()
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href$='/op/deploy/']"
)))
recent_shut_off
=
self
.
recently
(
self
.
get_timeline_elements
(
recent_shut_off
=
self
.
recently
(
self
.
get_timeline_elements
(
"vm.Instance.shut_off"
))
"vm.Instance.shut_off"
))
if
not
self
.
check_operation_result
(
recent_shut_off
):
if
not
self
.
check_operation_result
(
recent_shut_off
,
"a[href*='#activity']"
):
logger
.
warning
(
"Selenium cannot shut off the "
logger
.
warning
(
"Selenium cannot shut off the "
"chosen template virtual machine"
)
"chosen template virtual machine"
)
raise
Exception
(
'Cannot shut off the virtual machine'
)
raise
Exception
(
'Cannot shut off the virtual machine'
)
...
@@ -234,7 +240,8 @@ class CircleSeleniumMixin(object):
...
@@ -234,7 +240,8 @@ class CircleSeleniumMixin(object):
raise
Exception
(
raise
Exception
(
'Cannot find the template
\'
s id'
)
'Cannot find the template
\'
s id'
)
def
check_operation_result
(
self
,
operation_id
,
restore
=
True
):
def
check_operation_result
(
self
,
operation_id
,
restore_selector
=
None
,
restore
=
True
):
"""
"""
Returns wheter the operation_id result is success (returns: boolean)
Returns wheter the operation_id result is success (returns: boolean)
"""
"""
...
@@ -254,19 +261,36 @@ class CircleSeleniumMixin(object):
...
@@ -254,19 +261,36 @@ class CircleSeleniumMixin(object):
result
=
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
result
=
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
visibility_of_element_located
((
ec
.
visibility_of_element_located
((
By
.
ID
,
"activity_status"
)))
By
.
ID
,
"activity_status"
)))
logger
.
warning
(
"
%(id)
s
result tex
t is '
%(result)
s'"
%
{
logger
.
warning
(
"
%(id)
s
's resul
t is '
%(result)
s'"
%
{
'id'
:
operation_id
,
'id'
:
operation_id
,
'result'
:
result
.
text
})
'result'
:
result
.
text
})
if
(
result
.
text
==
"success"
):
if
(
result
.
text
==
"success"
):
out
=
True
out
=
True
elif
(
result
.
text
==
"wait"
):
elif
(
result
.
text
==
"wait"
):
time
.
sleep
(
2
)
time
.
sleep
(
2
)
out
=
self
.
check_operation_result
(
operation_id
,
False
)
out
=
self
.
check_operation_result
(
operation_id
=
operation_id
,
restore
=
False
)
else
:
else
:
try
:
result_text
=
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
visibility_of_element_located
((
By
.
ID
,
"activity_result_text"
)))
logger
.
warning
(
"
%(id)
s's result text is: '
%(result_text)
s'"
%
{
'id'
:
operation_id
,
'result_text'
:
result_text
.
text
})
except
:
logger
.
warning
(
"Cannot read
%(id)
s's result text"
%
{
'id'
:
operation_id
})
out
=
False
out
=
False
if
restore
:
if
restore
:
logger
.
warning
(
"Restoring to
%
s url"
%
url_save
)
logger
.
warning
(
"Restoring to
%
s url"
%
url_save
)
self
.
driver
.
get
(
url_save
)
self
.
driver
.
get
(
url_save
)
if
restore_selector
is
not
None
and
restore_selector
:
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
visibility_of_element_located
((
By
.
CSS_SELECTOR
,
restore_selector
)))
return
out
return
out
except
:
except
:
logger
.
exception
(
"Selenium cannot check the"
logger
.
exception
(
"Selenium cannot check the"
...
@@ -279,46 +303,73 @@ class CircleSeleniumMixin(object):
...
@@ -279,46 +303,73 @@ class CircleSeleniumMixin(object):
second
=
self
.
conf
.
recently_sec
second
=
self
.
conf
.
recently_sec
try
:
try
:
if
isinstance
(
timeline_dict
,
dict
):
if
isinstance
(
timeline_dict
,
dict
):
recent
=
None
for
key
,
value
in
timeline_dict
.
iteritems
():
for
key
,
value
in
timeline_dict
.
iteritems
():
time
=
datetime
.
strptime
(
key
,
'
%
Y-
%
m-
%
d
%
H:
%
M'
)
if
recent
is
None
or
int
(
key
)
>
int
(
recent
):
delta
=
datetime
.
now
()
-
time
recent
=
key
if
delta
.
total_seconds
()
<=
second
:
if
len
(
timeline_dict
)
>
1
:
return
value
logger
.
warning
(
"Searching for most recent activity"
" from the received
%(count)
s pieces"
%
{
'count'
:
len
(
timeline_dict
)})
logger
.
warning
(
"Found at
%(id)
s @
%(time)
s"
%
{
'id'
:
timeline_dict
[
recent
],
'time'
:
datetime
.
fromtimestamp
(
int
(
recent
))
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)})
logger
.
warning
(
"Checking wheter
%(id)
s started in the"
" recent
%(second)
s seconds"
%
{
'id'
:
timeline_dict
[
recent
],
'second'
:
second
})
delta
=
datetime
.
now
()
-
datetime
.
fromtimestamp
(
int
(
recent
))
if
delta
.
total_seconds
()
<=
second
:
return
timeline_dict
[
recent
]
except
:
except
:
logger
.
exception
(
"Selenium cannot filter"
logger
.
exception
(
"Selenium cannot filter
timeline
"
"
timeline activities to
recent"
)
"
activities to find most
recent"
)
raise
Exception
(
raise
Exception
(
'Cannot filter timeline activities to recent'
)
'Cannot filter timeline activities to
find most
recent'
)
def
get_timeline_elements
(
self
,
code
=
None
):
def
get_timeline_elements
(
self
,
code
=
None
):
try
:
try
:
if
code
is
None
:
if
code
is
None
:
css_activity_selector
=
"div[data-activity-code]"
css_activity_selector
=
"div[data-activity-code]"
code
=
"all activity"
code
_text
=
"all activity"
else
:
else
:
code_text
=
code
css_activity_selector
=
(
"div[data-activity-code="
css_activity_selector
=
(
"div[data-activity-code="
"'
%(code)
s']"
%
{
"'
%(code)
s']"
%
{
'code'
:
code
})
'code'
:
code_text
})
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
self
.
click_on_link
(
WebDriverWait
(
ec
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href*='#activity']"
)))
.
click
()
activity_dict
=
{}
timeline
=
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
visibility_of_element_located
((
ec
.
element_to_be_clickable
((
By
.
ID
,
"activity-timeline"
)))
By
.
CSS_SELECTOR
,
"a[href*='#activity']"
))))
searched_activity
=
timeline
.
find_elements_by_css_selector
(
try
:
css_activity_selector
)
activity_dict
=
{}
logger
.
warning
(
"Found activity list for
%
s:"
%
code
)
timeline
=
WebDriverWait
(
for
activity
in
searched_activity
:
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
activity_id
=
activity
.
get_attribute
(
'data-activity-id'
)
ec
.
visibility_of_element_located
((
activity_text
=
activity
.
text
By
.
ID
,
"activity-timeline"
)))
key
=
re
.
search
(
searched_activity
=
timeline
.
find_elements_by_css_selector
(
r'\d+-\d+-\d+ \d+:\d+,'
,
activity_text
)
.
group
()[:
-
1
]
css_activity_selector
)
logger
.
warning
(
"
%(id)
s @
%(activity)
s"
%
{
logger
.
warning
(
"Found activity list for
%
s:"
%
code_text
)
'id'
:
activity_id
,
for
activity
in
searched_activity
:
'activity'
:
key
})
activity_id
=
activity
.
get_attribute
(
'data-activity-id'
)
activity_dict
[
key
]
=
activity_id
key
=
activity
.
get_attribute
(
'timestamp'
)
logger
.
warning
(
"
%(id)
s @
%(activity)
s"
%
{
'id'
:
activity_id
,
'activity'
:
datetime
.
fromtimestamp
(
int
(
key
))
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)})
activity_dict
[
key
]
=
activity_id
except
StaleElementReferenceException
:
logger
.
warning
(
'Timeline changed while processing it'
)
return
self
.
get_timeline_elements
(
code
)
except
:
logger
.
exception
(
'Selenium cannot get timeline elemets'
)
raise
Exception
(
'Cannot get timeline elements'
)
if
len
(
activity_dict
)
==
0
:
logger
.
warning
(
'Found activity list is empty'
)
raise
Exception
(
'Selenium did not found any activity'
)
return
activity_dict
return
activity_dict
except
:
except
:
logger
.
exception
(
'Selenium cannot find the searched activity'
)
logger
.
exception
(
'Selenium cannot find the searched activity'
)
...
@@ -355,6 +406,10 @@ class CircleSeleniumMixin(object):
...
@@ -355,6 +406,10 @@ class CircleSeleniumMixin(object):
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
visibility_of_element_located
((
ec
.
visibility_of_element_located
((
By
.
ID
,
"_activity"
)))
By
.
ID
,
"_activity"
)))
self
.
click_on_link
(
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
element_to_be_clickable
((
By
.
CSS_SELECTOR
,
"a[href*='#activity']"
))))
recent_remove_disk
=
self
.
recently
(
recent_remove_disk
=
self
.
recently
(
self
.
get_timeline_elements
(
self
.
get_timeline_elements
(
"vm.Instance.remove_disk"
))
"vm.Instance.remove_disk"
))
...
@@ -401,7 +456,8 @@ class CircleSeleniumMixin(object):
...
@@ -401,7 +456,8 @@ class CircleSeleniumMixin(object):
vm_list
[
choice
]
.
click
()
vm_list
[
choice
]
.
click
()
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
element_to_be_clickable
((
ec
.
element_to_be_clickable
((
By
.
CLASS_NAME
,
'vm-create-start'
)))
.
click
()
By
.
CSS_SELECTOR
,
"button[class*='vm-create-start']"
)))
.
click
()
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
WebDriverWait
(
self
.
driver
,
self
.
conf
.
wait_max_sec
)
.
until
(
ec
.
visibility_of_element_located
((
ec
.
visibility_of_element_located
((
By
.
CLASS_NAME
,
'alert-success'
)))
By
.
CLASS_NAME
,
'alert-success'
)))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment