Statistics
| Branch: | Revision:

root / env / lib / python2.7 / site-packages / django / contrib / admin / tests.py @ 1a305335

History | View | Annotate | Download (4.23 KB)

1
import sys
2

    
3
from django.test import LiveServerTestCase
4
from django.utils.importlib import import_module
5
from django.utils.unittest import SkipTest
6
from django.utils.translation import ugettext as _
7

    
8
class AdminSeleniumWebDriverTestCase(LiveServerTestCase):
9
    webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
10

    
11
    @classmethod
12
    def setUpClass(cls):
13
        if sys.version_info < (2, 6):
14
            raise SkipTest('Selenium Webdriver does not support Python < 2.6.')
15
        try:
16
            # Import and start the WebDriver class.
17
            module, attr = cls.webdriver_class.rsplit('.', 1)
18
            mod = import_module(module)
19
            WebDriver = getattr(mod, attr)
20
            cls.selenium = WebDriver()
21
        except Exception, e:
22
            raise SkipTest('Selenium webdriver "%s" not installed or not '
23
                           'operational: %s' % (cls.webdriver_class, str(e)))
24
        super(AdminSeleniumWebDriverTestCase, cls).setUpClass()
25

    
26
    @classmethod
27
    def tearDownClass(cls):
28
        if hasattr(cls, 'selenium'):
29
            cls.selenium.quit()
30
        super(AdminSeleniumWebDriverTestCase, cls).tearDownClass()
31

    
32
    def wait_until(self, callback, timeout=10):
33
        """
34
        Helper function that blocks the execution of the tests until the
35
        specified callback returns a value that is not falsy. This function can
36
        be called, for example, after clicking a link or submitting a form.
37
        See the other public methods that call this function for more details.
38
        """
39
        from selenium.webdriver.support.wait import WebDriverWait
40
        WebDriverWait(self.selenium, timeout).until(callback)
41

    
42
    def wait_loaded_tag(self, tag_name, timeout=10):
43
        """
44
        Helper function that blocks until the element with the given tag name
45
        is found on the page.
46
        """
47
        self.wait_until(
48
            lambda driver: driver.find_element_by_tag_name(tag_name),
49
            timeout
50
        )
51

    
52
    def admin_login(self, username, password, login_url='/admin/'):
53
        """
54
        Helper function to log into the admin.
55
        """
56
        self.selenium.get('%s%s' % (self.live_server_url, login_url))
57
        username_input = self.selenium.find_element_by_name('username')
58
        username_input.send_keys(username)
59
        password_input = self.selenium.find_element_by_name('password')
60
        password_input.send_keys(password)
61
        login_text = _('Log in')
62
        self.selenium.find_element_by_xpath(
63
            '//input[@value="%s"]' % login_text).click()
64
        # Wait for the next page to be loaded.
65
        self.wait_loaded_tag('body')
66

    
67
    def get_css_value(self, selector, attribute):
68
        """
69
        Helper function that returns the value for the CSS attribute of an
70
        DOM element specified by the given selector. Uses the jQuery that ships
71
        with Django.
72
        """
73
        return self.selenium.execute_script(
74
            'return django.jQuery("%s").css("%s")' % (selector, attribute))
75

    
76
    def get_select_option(self, selector, value):
77
        """
78
        Returns the <OPTION> with the value `value` inside the <SELECT> widget
79
        identified by the CSS selector `selector`.
80
        """
81
        from selenium.common.exceptions import NoSuchElementException
82
        options = self.selenium.find_elements_by_css_selector('%s > option' % selector)
83
        for option in options:
84
            if option.get_attribute('value') == value:
85
                return option
86
        raise NoSuchElementException('Option "%s" not found in "%s"' % (value, selector))
87

    
88
    def assertSelectOptions(self, selector, values):
89
        """
90
        Asserts that the <SELECT> widget identified by `selector` has the
91
        options with the given `values`.
92
        """
93
        options = self.selenium.find_elements_by_css_selector('%s > option' % selector)
94
        actual_values = []
95
        for option in options:
96
            actual_values.append(option.get_attribute('value'))
97
        self.assertEqual(values, actual_values)
98

    
99
    def has_css_class(self, selector, klass):
100
        """
101
        Returns True if the element identified by `selector` has the CSS class
102
        `klass`.
103
        """
104
        return (self.selenium.find_element_by_css_selector(selector)
105
                .get_attribute('class').find(klass) != -1)