1
|
|
|
# -*- coding: utf-8 -*- |
2
|
|
|
"""Django page CMS selemium test module""" |
3
|
|
|
from unittest import SkipTest |
4
|
|
|
|
5
|
|
|
from django.contrib import auth |
6
|
|
|
from django.core.urlresolvers import reverse |
7
|
|
|
from django.test import LiveServerTestCase |
8
|
|
|
from pages import settings |
9
|
|
|
from pages.models import Page |
10
|
|
|
from pages.tests.testcase import TestCase |
11
|
|
|
from selenium import webdriver |
12
|
|
|
from selenium.common.exceptions import TimeoutException |
13
|
|
|
from selenium.webdriver.support.ui import WebDriverWait |
14
|
|
|
|
15
|
|
|
screenshot_nb = 1 |
16
|
|
|
TIMEOUT = 10 |
17
|
|
|
|
18
|
|
|
|
19
|
|
|
class SeleniumTestCase(TestCase, LiveServerTestCase): |
20
|
|
|
|
21
|
|
|
def setUp(self): |
22
|
|
|
self.browser = webdriver.PhantomJS() |
23
|
|
|
self.browser.set_page_load_timeout(TIMEOUT) |
24
|
|
|
self.get_admin_client() |
25
|
|
|
|
26
|
|
|
# setUp is where you instantiate the selenium webdriver and loads the browser. |
27
|
|
|
auth.models.User.objects.create_superuser( |
28
|
|
|
username='admin_s', |
29
|
|
|
password='admin', |
30
|
|
|
email='[email protected]' |
31
|
|
|
) |
32
|
|
|
|
33
|
|
|
self.browser.get('%s%s' % (self.live_server_url, reverse("admin:index"))) |
34
|
|
|
|
35
|
|
|
super(SeleniumTestCase, self).setUp() |
36
|
|
|
|
37
|
|
|
def screenshot(self): |
38
|
|
|
global screenshot_nb |
39
|
|
|
if settings.PAGE_TESTS_SAVE_SCREENSHOTS: |
40
|
|
|
self.browser.save_screenshot('screenshot_%d.png' % screenshot_nb) |
41
|
|
|
screenshot_nb += 1 |
42
|
|
|
|
43
|
|
|
def select_option(self, select, option_id): |
44
|
|
|
for option in select.find_elements_by_tag_name('option'): |
45
|
|
|
if option.get_attribute('value') == str(option_id): |
46
|
|
|
option.click() |
47
|
|
|
|
48
|
|
|
def visit(self, url): |
49
|
|
|
# Open the django admin page. |
50
|
|
|
# DjangoLiveServerTestCase provides a live server url attribute |
51
|
|
|
# to access the base url in tests |
52
|
|
|
url = '%s%s' % (self.live_server_url, url) |
53
|
|
|
try: |
54
|
|
|
return self.browser.get(url) |
55
|
|
|
except TimeoutException: |
56
|
|
|
raise SkipTest("Timeout: get({0})".format(repr(url))) |
57
|
|
|
|
58
|
|
|
def find_element_by_css_selector(self, selector): |
59
|
|
|
return self.timeout('find_element_by_css_selector', selector) |
60
|
|
|
|
61
|
|
|
def find_elements_by_css_selector(self, selector): |
62
|
|
|
return self.timeout('find_elements_by_css_selector', selector) |
63
|
|
|
|
64
|
|
|
def find_element_by_id(self, id): |
65
|
|
|
return self.timeout('find_element_by_id', id) |
66
|
|
|
|
67
|
|
|
def timeout(self, command, param, timeout=TIMEOUT): |
68
|
|
|
wait = WebDriverWait(self.browser, timeout) |
69
|
|
|
try: |
70
|
|
|
return wait.until(lambda b: getattr(b, command)(param)) |
71
|
|
|
except TimeoutException: |
72
|
|
|
raise SkipTest("Timeout: {0}({1})".format(command, repr(param))) |
73
|
|
|
|
74
|
|
|
def click(self, selector): |
75
|
|
|
return self.browser.find_element_by_css_selector(selector).click() |
76
|
|
|
|
77
|
|
|
def login(self): |
78
|
|
|
self.visit(reverse("admin:index")) |
79
|
|
|
# Fill login information of admin |
80
|
|
|
username = self.find_element_by_id("id_username") |
81
|
|
|
username.send_keys("admin_s") |
82
|
|
|
password = self.find_element_by_id("id_password") |
83
|
|
|
password.send_keys("admin") |
84
|
|
|
self.click("input[type='submit']") |
85
|
|
|
|
86
|
|
|
def tearDown(self): |
87
|
|
|
self.browser.quit() |
88
|
|
|
super(SeleniumTestCase, self).tearDown() |
89
|
|
|
|
90
|
|
|
def url_change(self, id): |
91
|
|
|
return reverse('admin:pages_page_change', args=[id]) |
92
|
|
|
|
93
|
|
|
def test_admin_select(self): |
94
|
|
|
self.login() |
95
|
|
|
page = self.new_page() |
96
|
|
|
self.visit(self.url_change(page.id)) |
97
|
|
|
status = self.find_element_by_id('id_status') |
98
|
|
|
self.assertEqual(status.get_attribute('value'), str(page.status)) |
99
|
|
|
|
100
|
|
|
self.select_option(status, str(Page.DRAFT)) |
101
|
|
|
self.assertEqual(status.get_attribute('value'), str(Page.DRAFT)) |
102
|
|
|
|
103
|
|
|
src = self.find_element_by_css_selector( |
104
|
|
|
'.field-status' |
105
|
|
|
).find_element_by_tag_name( |
106
|
|
|
'img' |
107
|
|
|
).get_attribute('src') |
108
|
|
|
|
109
|
|
|
self.assertTrue(src.endswith('draft.gif')) |
110
|
|
|
|
111
|
|
|
def test_admin_move_page(self): |
112
|
|
|
self.login() |
113
|
|
|
page_1 = self.new_page({'slug': 'p1'}) |
114
|
|
|
page_2 = self.new_page({'slug': 'p2'}) |
115
|
|
|
self.visit(reverse('admin:pages_page_changelist')) |
116
|
|
|
|
117
|
|
|
rows = self.find_elements_by_css_selector('#page-list tbody tr') |
118
|
|
|
row_1 = rows[0] |
119
|
|
|
row_2 = rows[1] |
120
|
|
|
|
121
|
|
|
self.assertEqual(row_1.get_attribute('id'), 'page-row-%d' % page_1.id) |
122
|
|
|
self.assertEqual(row_2.get_attribute('id'), 'page-row-%d' % page_2.id) |
123
|
|
|
|
124
|
|
|
page_3 = self.new_page({'slug': 'p3'}) |
125
|
|
|
|
126
|
|
|
self.click('#move-link-%d' % page_2.id) |
127
|
|
|
self.click('#move-target-%d .move-target.left' % page_1.id) |
128
|
|
|
|
129
|
|
|
self.find_element_by_id('page-row-%d' % page_3.id) |
130
|
|
|
|
131
|
|
|
rows = self.find_elements_by_css_selector('#page-list tbody tr') |
132
|
|
|
row_1 = rows[0] |
133
|
|
|
row_2 = rows[1] |
134
|
|
|
row_3 = rows[2] |
135
|
|
|
|
136
|
|
|
self.assertEqual(row_1.get_attribute('id'), 'page-row-%d' % page_2.id) |
137
|
|
|
self.assertEqual(row_2.get_attribute('id'), 'page-row-%d' % page_1.id) |
138
|
|
|
self.assertEqual(row_3.get_attribute('id'), 'page-row-%d' % page_3.id) |
139
|
|
|
|
140
|
|
|
def test_admin_export_json(self): |
141
|
|
|
self.login() |
142
|
|
|
self.new_page({'slug': 'p1'}) |
143
|
|
|
self.new_page({'slug': 'p2'}) |
144
|
|
|
self.visit(reverse('admin:pages_page_changelist')) |
145
|
|
|
|
146
|
|
|
self.find_elements_by_css_selector('#action-toggle')[0].click() |
147
|
|
|
|
148
|
|
|
action_select = self.find_elements_by_css_selector( |
149
|
|
|
'[name="action"]')[0] |
150
|
|
|
self.select_option(action_select, 'export_pages_as_json') |
151
|
|
|
|
152
|
|
|
self.find_elements_by_css_selector('[name="index"]')[0].click() |
153
|
|
|
|
154
|
|
|
# apparently there is no easy way to test a download? |
155
|
|
|
|