# # Copyright (C) 2018 FreeIPA Contributors see COPYING for license # """ Test translations """ from ipatests.test_webui.ui_driver import UI_driver from ipatests.test_webui.ui_driver import screenshot try: from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait except ImportError: pass import pytest from re import sub from lxml import html from ipalib import api, util class ConfigPageBase(UI_driver): """ Base class to test translation of pages which are located at /ipa/config/ """ page_name = '' def init_app(self): """ Load a web page """ self.url = '/'.join((self.get_base_url(), self.page_name)) self.load() def get_base_url(self): """ Get FreeIPA Web UI config url """ host = self.config.get('ipa_server') if not host: self.skip('FreeIPA server hostname not configured') return 'https://%s/ipa/config' % host def files_loaded(self): """ Test if dependencies were loaded. (Checks if page has been rendered) """ indicator = self.find(".info-page", By.CSS_SELECTOR) return indicator is not None def load(self): """ Navigate to Web page and wait for loading of all dependencies. """ self.driver.get(self.url) runner = self WebDriverWait(self.driver, 10).until( lambda d: runner.files_loaded() ) def page_raw_source(self): """ Retrieve a raw source of the web page """ host = api.env.host cacert = api.env.tls_ca_cert conn = util.create_https_connection(host, cafile=cacert) conn.request('GET', self.url) response = conn.getresponse() # check successful response from a server assert response.status == 200 return response.read().decode('utf-8') def has_no_child(self, tag, child_tag): """ Check if element with the given tag has no child with the given one """ parent = self.find("#{}".format(tag), By.CSS_SELECTOR) if parent is None: return True child_element = self.find(".//{}".format(child_tag), By.XPATH, parent) return child_element is None def innerhtml(self, id): """ Extract html text from the current opened page by the given id """ dom_element = self.find("#{}".format(id), By.CSS_SELECTOR) return dom_element.get_attribute('innerHTML').split('\n') def innerhtml_noscript(self, id, raw_page): """ Extract html text from the given raw source of the page under the 'noscript' html tag with the given id """ html_tree = html.fromstring(raw_page) noscript_tree = html_tree.xpath( "//div[@id='{}']/noscript/*".format(id) ) noscript_html_text = ''.join([html.tostring(elem, encoding="unicode") for elem in noscript_tree]) noscript_html = [] # remove trailing whitespaces between close and open tags for html_row in noscript_html_text.split('\n'): noscript_html.append(sub('^[ ]+(?=(<|[ ]*$))', '', html_row)) return noscript_html def check_noscript_innerhtml(self, html_id): """ Compare inner html under enabled javascript and disabled one """ # check if js is enabled in browser assert self.has_no_child(html_id, 'noscript') html_js_enabled = self.innerhtml(html_id) raw_page = self.page_raw_source() html_js_disabled = self.innerhtml_noscript(html_id, raw_page) assert html_js_enabled == html_js_disabled @pytest.mark.tier1 class TestSsbrowserPage(ConfigPageBase): """ Test translation of ssbrowser.html page """ page_name = 'ssbrowser.html' @screenshot def test_long_text_of_ssbrowser_page(self): """ Tests whether the text from '@i18n:ssbrowser-page' is synced against '