Source code for fobi.tests.base

import gc
import logging

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.support.wait import WebDriverWait

from django.core.management import call_command
from django.urls import reverse
from django.test import LiveServerTestCase
from django.conf import settings

from . import constants
from .helpers import (
    setup_app,
    get_or_create_admin_user,
    phantom_js_clean_up,
)

__title__ = 'fobi.tests.test_browser_build_dynamic_forms'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2014-2019 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = (
    'BaseFobiBrowserBuldDynamicFormsTest',
)

logger = logging.getLogger(__name__)

TIMEOUT = 4
LONG_TIMEOUT = 8
WAIT = False
WAIT_FOR = 0


[docs]class BaseFobiBrowserBuldDynamicFormsTest(LiveServerTestCase): """Browser tests django-fobi bulding forms functionality. Backed up by selenium. This test is based on the bootstrap3 theme. """ reset_sequences = True cleans_up_after_itself = True try: LIVE_SERVER_URL = settings.LIVE_SERVER_URL except Exception as e: LIVE_SERVER_URL = None
[docs] def tearDown(self): """Tear down.""" super(BaseFobiBrowserBuldDynamicFormsTest, self).tearDown() call_command('flush', verbosity=0, interactive=False, reset_sequences=True, allow_cascade=True, inhibit_post_migrate=False)
# gc.collect()
[docs] @classmethod def setUpClass(cls): """Set up class.""" chrome_driver_path = getattr( settings, 'CHROME_DRIVER_EXECUTABLE_PATH', None ) chrome_driver_options = getattr( settings, 'CHROME_DRIVER_OPTIONS', None ) firefox_bin_path = getattr(settings, 'FIREFOX_BIN_PATH', None) phantom_js_executable_path = getattr( settings, 'PHANTOM_JS_EXECUTABLE_PATH', None ) if chrome_driver_path is not None: cls.driver = webdriver.Chrome( executable_path=chrome_driver_path, chrome_options=chrome_driver_options ) elif phantom_js_executable_path is not None: if phantom_js_executable_path: cls.driver = webdriver.PhantomJS( executable_path=phantom_js_executable_path ) else: cls.driver = webdriver.PhantomJS() elif firefox_bin_path: binary = FirefoxBinary(firefox_bin_path) cls.driver = webdriver.Firefox(firefox_binary=binary) else: cls.driver = webdriver.Firefox() setup_app(fobi_sync_plugins=True) # user = get_or_create_admin_user() # create_form_with_entries(user) super(BaseFobiBrowserBuldDynamicFormsTest, cls).setUpClass()
[docs] @classmethod def tearDownClass(cls): """Tear down class.""" try: cls.driver.quit() phantom_js_clean_up() except Exception as err: print(err) super(BaseFobiBrowserBuldDynamicFormsTest, cls).tearDownClass() call_command('flush', verbosity=0, interactive=False, reset_sequences=True, allow_cascade=True, inhibit_post_migrate=False)
# gc.collect() # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++ Internals +++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++++++++++++++++ General +++++++++++++++++++++++++++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ def _get_live_server_url(self): """Get live server URL.""" return self.LIVE_SERVER_URL \ if self.LIVE_SERVER_URL \ else self.live_server_url def _authenticate(self): """Authenticate.""" # Make sure the user exists user = get_or_create_admin_user() self.driver.get( '{0}{1}'.format( self._get_live_server_url(), reverse('auth_login') ) ) self.driver.maximize_window() username_input = self.driver.find_element_by_name("username") username_input.send_keys(constants.FOBI_TEST_USER_USERNAME) password_input = self.driver.find_element_by_name("password") password_input.send_keys(constants.FOBI_TEST_USER_PASSWORD) self.driver.find_element_by_xpath('//button[@type="submit"]').click() # Wait until the list view opens WebDriverWait(self.driver, timeout=TIMEOUT).until( # lambda driver: driver.find_element_by_id('id_main') lambda driver: driver.find_element_by_xpath( '//body[contains(@class, "theme")]' ) ) def _sleep(self, wait=WAIT_FOR): """Sleep.""" if WAIT and wait: self.driver.implicitly_wait(wait) def _click(self, element): """Click on any element.""" self.driver.execute_script("arguments[0].click();", element) def _aggressive_click(self, element): """Aggressive click.""" link = element.get_attribute('href') self.driver.get(link) def _scroll_to_element(self, form_element, simple=False): """Scroll to element.""" coordinates = form_element.location_once_scrolled_into_view if simple: return x = coordinates.get('x', 0) y = coordinates.get('y', 0) self.driver.execute_script( "window.scrollTo({0}, {1});".format(x, y) ) self.driver.execute_script( "window.scrollBy({0}, {1});".format(0, -100) ) def _move_to_element(self, form_element, simple=False): """Move to element.""" ActionChains(self.driver).move_to_element(form_element).perform() def _scroll_to(self, x, y): """Scroll to.""" self.driver.execute_script( "window.scrollTo({0}, {1});".format(x, y) ) def _scroll_by(self, x, y): """Scroll by.""" self.driver.execute_script( "window.scrollBy({0}, {1});".format(x, y) ) def _scroll_page_top(self): """Scroll to the page top.""" html = self.driver.find_element_by_tag_name('html') html.send_keys(Keys.HOME) def _scroll_page_bottom(self): """Scroll to the page bottom.""" html = self.driver.find_element_by_tag_name('html') html.send_keys(Keys.END)