2
2
import sys
3
3
4
4
from selenium import webdriver
5
+ from selenium .common .exceptions import NoSuchElementException
6
+ from selenium .webdriver .common .keys import Keys
5
7
import pytest
6
8
7
- from codebender_testing .config import WEBDRIVERS
8
9
from codebender_testing .config import BASE_URL
10
+ from codebender_testing .config import TEST_CREDENTIALS
11
+ from codebender_testing .config import WEBDRIVERS
9
12
10
13
11
14
class SeleniumTestCase (object ):
@@ -20,14 +23,40 @@ def setup(self, request):
20
23
webdriver_cls = WEBDRIVERS [request .param ]
21
24
self .driver = webdriver_cls ()
22
25
23
- def open (self , url ):
26
+ def open (self , url = None ):
24
27
"""Open the resource specified by `url`.
25
28
If an absolute URL is specified (like 'http://codebender.cc') we
26
29
use that URL. Otherwise the resource is relative to `BASE_URL` in
27
30
`codebender_testing.config`.
28
31
"""
32
+ if url is None :
33
+ url = ''
29
34
if re .match (".+?://^" , url ):
35
+ # url specifies an absolute path.
30
36
return self .driver .get (url )
31
37
else :
32
38
return self .driver .get ("%s/%s" % (BASE_URL , url ))
33
39
40
+
41
+ def logged_in (func ):
42
+ """Decorator to ensure the user is logged in before performing a test.
43
+ If not logged in, a login will be performed."""
44
+ def inner (* args , ** kwargs ):
45
+ test = args [0 ]
46
+ try :
47
+ test .open ()
48
+ login_button = test .driver .find_element_by_id ('login_btn' )
49
+ login_button .send_keys (Keys .ENTER )
50
+ # Enter credentials and log in
51
+ user_field = test .driver .find_element_by_id ('username' )
52
+ user_field .send_keys (TEST_CREDENTIALS ['username' ])
53
+ pass_field = test .driver .find_element_by_id ('password' )
54
+ pass_field .send_keys (TEST_CREDENTIALS ['password' ])
55
+ do_login = test .driver .find_element_by_id ('_submit' )
56
+ do_login .send_keys (Keys .ENTER )
57
+ except NoSuchElementException :
58
+ # 'Log In' is not displayed, so we're already logged in.
59
+ pass
60
+ return func (* args , ** kwargs )
61
+ return inner
62
+
0 commit comments