Completed
Pull Request — master (#153)
by
unknown
01:11
created

SeleniumTestCase.wait()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 3
rs 10
cc 1
1
# -*- coding: utf-8 -*-
2
"""Django page CMS selemium test module"""
3
from pages.models import Page
4
from pages.tests.testcase import TestCase
5
from pages import settings
6
from django.core.urlresolvers import reverse
7
from django.test import LiveServerTestCase
8
from django.contrib import auth
9
10
from selenium import webdriver
11
from selenium.common.exceptions import TimeoutException
12
from selenium.webdriver.support.ui import WebDriverWait
13
14
from unittest import SkipTest
15
16
17
screenshot_nb = 1
18
timeout = 10
19
20
21
class SeleniumTestCase(TestCase, LiveServerTestCase):
22
23
    def setUp(self):
24
        self.browser = webdriver.PhantomJS()
25
        self.browser.set_page_load_timeout(timeout)
26
        self.get_admin_client()
27
28
        # setUp is where you instantiate the selenium webdriver and loads the browser.
29
        auth.models.User.objects.create_superuser(
30
            username='admin_s',
31
            password='admin',
32
            email='[email protected]'
33
        )
34
35
        self.browser.get('%s%s' % (self.live_server_url,  reverse("admin:index")))
36
37
        super(SeleniumTestCase, self).setUp()
38
39
    def screenshot(self):
40
        global screenshot_nb
41
        if settings.PAGE_TESTS_SAVE_SCREENSHOTS:
42
            self.browser.save_screenshot('screenshot_%d.png' % screenshot_nb)
43
            screenshot_nb += 1
44
45
    def select_option(self, select, option_id):
46
        for option in select.find_elements_by_tag_name('option'):
47
            if option.get_attribute('value') == str(option_id):
48
                option.click()
49
50
    def visit(self, url):
51
        # Open the django admin page.
52
        # DjangoLiveServerTestCase provides a live server url attribute
53
        # to access the base url in tests
54
        url = '%s%s' % (self.live_server_url,  url)
55
        try:
56
            return self.browser.get(url)
57
        except TimeoutException:
58
            raise SkipTest("Timeout: get({1})".format(repr(url)))
59
60
    def find_element_by_css_selector(self, selector):
61
        return self.timeout('find_element_by_css_selector', selector)
62
63
    def find_element_by_id(self, id):
64
        return self.timeout('find_element_by_id', id)
65
66
    def timeout(self, command, param, timeout=timeout):
67
        wait = WebDriverWait(self.browser, timeout)
68
        try:
69
            return wait.until(lambda b: getattr(b, command)(param))
70
        except TimeoutException:
71
            raise SkipTest("Timeout: {0}({1})".format(command, repr(param)))
72
73
    def click(self, selector):
74
        return self.browser.find_element_by_css_selector(selector).click()
75
76
    def login(self):
77
        self.visit(reverse("admin:index"))
78
        # Fill login information of admin
79
        username = self.find_element_by_id("id_username")
80
        username.send_keys("admin_s")
81
        password = self.find_element_by_id("id_password")
82
        password.send_keys("admin")
83
        self.click("input[type='submit']")
84
85
    def tearDown(self):
86
        self.browser.quit()
87
        super(SeleniumTestCase, self).tearDown()
88
89
    def url_change(self, id):
90
        return reverse('admin:pages_page_change', args=[id])
91
92
    def test_admin_select(self):
93
        self.login()
94
        page = self.new_page()
95
        self.visit(self.url_change(page.id))
96
        status = self.find_element_by_id('id_status')
97
        self.assertEqual(status.get_attribute('value'), str(page.status))
98
99
        self.select_option(status, str(Page.DRAFT))
100
        self.assertEqual(status.get_attribute('value'), str(Page.DRAFT))
101
102
        src = self.find_element_by_css_selector('.field-status'
103
            ).find_element_by_tag_name('img'
104
            ).get_attribute('src')
105
106
        self.assertTrue(src.endswith('draft.gif'))
107
108
    def test_admin_move_page(self):
109
        self.login()
110
        page_1 = self.new_page({'slug':'p1'})
111
        page_2 = self.new_page({'slug':'p2'})
112
        self.visit(reverse('admin:pages_page_changelist'))
113
114
        h1 = self.find_element_by_css_selector('#content h1')
115
        self.assertEqual(h1.text, 'Select page to change')
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.screenshot()
137
138
        self.assertEqual(row_1.get_attribute('id'), 'page-row-%d' % page_2.id)
139
        self.assertEqual(row_2.get_attribute('id'), 'page-row-%d' % page_1.id)
140
        self.assertEqual(row_3.get_attribute('id'), 'page-row-%d' % page_3.id)
141