diff options
-rw-r--r-- | toasteruitest/Base_Utility.py | 279 | ||||
-rw-r--r-- | toasteruitest/ReadMe.txt | 44 | ||||
-rw-r--r-- | toasteruitest/Utility.py | 272 | ||||
-rw-r--r-- | toasteruitest/__init__.py | 0 | ||||
-rw-r--r-- | toasteruitest/run_toastertests.py | 114 | ||||
-rw-r--r-- | toasteruitest/toaster_automation_test.py | 1789 | ||||
-rw-r--r-- | toasteruitest/toaster_test.cfg | 10 |
7 files changed, 2508 insertions, 0 deletions
diff --git a/toasteruitest/Base_Utility.py b/toasteruitest/Base_Utility.py new file mode 100644 index 00000000000..1706a84dcad --- /dev/null +++ b/toasteruitest/Base_Utility.py @@ -0,0 +1,279 @@ +#!/usr/bin/python +# +# DESCRIPTION +# This is script has baseclass and contains class selenium-based functions. +# +import ConfigParser +import logging +import os +import platform +import sys +import time +import unittest +from selenium import webdriver +from selenium.common.exceptions import NoSuchElementException +from Utility import LogResults +from Utility import mkdir_p + +@LogResults +class toaster_cases_base(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.log = cls.logger_create() + + def setUp(self): + self.screenshot_sequence = 1 + self.verificationErrors = [] + self.accept_next_alert = True + self.host_os = platform.system().lower() + if os.getenv('TOASTER_SUITE'): + self.target_suite = os.getenv('TOASTER_SUITE') + else: + self.target_suite = self.host_os + + self.parser = ConfigParser.SafeConfigParser() + self.parser.read('toaster_test.cfg') + self.base_url = eval(self.parser.get('toaster_test_' + self.target_suite, 'toaster_url')) + self.log_tmp_dir = os.path.abspath(sys.path[0]) + os.sep + 'log' + os.sep + 'tmp' + try: + mkdir_p(self.log_tmp_dir) + except OSError : + logging.error("%(asctime)s Cannot create tmp dir under log, please check your privilege") + self.setup_browser() + + @staticmethod + def logger_create(): + log_file = "toaster-auto-" + time.strftime("%Y%m%d%H%M%S") + ".log" + if os.path.exists("toaster-auto.log"): os.remove("toaster-auto.log") + os.symlink(log_file, "toaster-auto.log") + + log = logging.getLogger("toaster") + log.setLevel(logging.DEBUG) + + fh = logging.FileHandler(filename=log_file, mode='w') + fh.setLevel(logging.DEBUG) + + ch = logging.StreamHandler(sys.stdout) + ch.setLevel(logging.INFO) + + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + fh.setFormatter(formatter) + ch.setFormatter(formatter) + + log.addHandler(fh) + log.addHandler(ch) + return log + + def setup_browser(self, *browser_path): + self.browser = eval(self.parser.get('toaster_test_' + self.target_suite, 'test_browser')) + print(self.browser) + if self.browser == "firefox": + driver = webdriver.Firefox() + elif self.browser == "chrome": + driver = webdriver.Chrome() + elif self.browser == "ie": + driver = webdriver.Ie() + else: + driver = None + print("unrecognized browser type, please check") + self.driver = driver + self.driver.implicitly_wait(30) + return self.driver + + def save_screenshot(self, **log_args): + types = [log_args.get('screenshot_type')] + if types == [None]: + types = ['native', 'selenium'] + add_name = log_args.get('append_name') + if not add_name: + add_name = '-' + sub_dir = log_args.get('log_sub_dir') + if not sub_dir: + sub_dir = 'case' + str(self.case_no) + for item in types: + log_dir = self.log_tmp_dir + os.sep + sub_dir + mkdir_p(log_dir) + log_path = log_dir + os.sep + self.browser + '-' +\ + item + '-' + add_name + '-' + str(self.screenshot_sequence) + '.png' + if item == 'native': + if self.host_os == "linux": + os.system("scrot " + log_path) + elif self.host_os=="darwin": + os.system("screencapture -x " + log_path) + elif item == 'selenium': + self.driver.get_screenshot_as_file(log_path) + self.screenshot_sequence += 1 + def find_element_by_text(self, string): + return self.driver.find_element_by_xpath("//*[text()='" + string + "']") + + def find_elements_by_text(self, string): + return self.driver.find_elements_by_xpath("//*[text()='" + string + "']") + + def find_element_by_text_in_table(self, table_id, text_string): + try: + table_element = self.get_table_element(table_id) + element = table_element.find_element_by_xpath("//*[text()='" + text_string + "']") + except NoSuchElementException as e: + print('no element found') + raise + return element + + def find_element_by_link_text_in_table(self, table_id, link_text): + try: + table_element = self.get_table_element(table_id) + element = table_element.find_element_by_link_text(link_text) + except NoSuchElementException as e: + print('no element found') + raise + return element + + + def find_elements_by_link_text_in_table(self, table_id, link_text): + try: + table_element = self.get_table_element(table_id) + element_list = table_element.find_elements_by_link_text(link_text) + except NoSuchElementException as e: + print('no element found') + raise + return element_list + + def find_element_by_partial_link_text_in_table(self, table_id, link_text): + try: + table_element = self.get_table_element(table_id) + element = table_element.find_element_by_partial_link_text(link_text) + return element + except NoSuchElementException as e: + print('no element found') + raise + + def find_elements_by_partial_link_text_in_table(self, table_id, link_text): + try: + table_element = self.get_table_element(table_id) + element_list = table_element.find_elements_by_partial_link_text(link_text) + return element_list + except NoSuchElementException as e: + print('no element found') + raise + + def find_element_by_xpath_in_table(self, table_id, xpath): + try: + table_element = self.get_table_element(table_id) + element = table_element.find_element_by_xpath(xpath) + except NoSuchElementException as e: + print('no element found') + raise + return element + + def find_elements_by_xpath_in_table(self, table_id, xpath): + try: + table_element = self.get_table_element(table_id) + element_list = table_element.find_elements_by_xpath(xpath) + except NoSuchElementException as e: + print('no elements found') + raise + return element_list + + def shortest_xpath(self, pname, pvalue): + return "//*[@" + pname + "='" + pvalue + "']" + + def get_table_column_text(self, attr_name, attr_value): + c_xpath = self.shortest_xpath(attr_name, attr_value) + elements = self.driver.find_elements_by_xpath(c_xpath) + c_list = [] + for element in elements: + c_list.append(element.text) + return c_list + + def get_table_column_text_by_column_number(self, table_id, column_number): + c_xpath = "//*[@id='" + table_id + "']//td[" + str(column_number) + "]" + elements = self.driver.find_elements_by_xpath(c_xpath) + c_list = [] + for element in elements: + c_list.append(element.text) + return c_list + + def get_table_head_text(self, *table_id): + if table_id: + thead_xpath = "//*[@id='" + table_id[0] + "']//thead//th[text()]" + elements = self.driver.find_elements_by_xpath(thead_xpath) + c_list = [] + for element in elements: + if element.text: + c_list.append(element.text) + return c_list + else: + return self.driver.find_element_by_xpath("//*/table/thead").text + + def get_table_element(self, table_id, *coordinate): + if len(coordinate) == 0: + element_xpath = "//*[@id='" + table_id + "']" + try: + element = self.driver.find_element_by_xpath(element_xpath) + except NoSuchElementException as e: + raise + return element + row = coordinate[0] + + if len(coordinate) == 1: + element_xpath = "//*[@id='" + table_id + "']/tbody/tr[" + str(row) + "]" + try: + element = self.driver.find_element_by_xpath(element_xpath) + except NoSuchElementException as e: + return False + return element + column = coordinate[1] + + element_xpath = "//*[@id='" + table_id + "']/tbody/tr[" + str(row) + "]/td[" + str(column) + "]" + try: + element = self.driver.find_element_by_xpath(element_xpath) + except NoSuchElementException as e: + return False + return element + + def get_table_data(self, table_id, row_count, column_count): + row = 1 + Lists = [] + while row <= row_count: + column = 1 + row_content=[] + while column <= column_count: + s= "//*[@id='" + table_id + "']/tbody/tr[" + str(row) +"]/td[" + str(column) + "]" + v = self.driver.find_element_by_xpath(s).text + row_content.append(v) + column = column + 1 + print("row_content=",row_content) + Lists.extend(row_content) + print(Lists[row-1][0]) + row = row + 1 + return Lists + + def is_text_present (self, patterns): + for pattern in patterns: + if str(pattern) not in self.driver.page_source: + print('Text "'+pattern+'" is missing') + return False + return True + + def is_element_present(self, how, what): + try: + self.driver.find_element(how, what) + except NoSuchElementException as e: + print('Could not find element '+str(what)+' by ' + str(how)) + return False + return True + + def get_case_number(self): + funcname = sys._getframe(1).f_code.co_name + caseno_str = funcname.strip('test_') + try: + caseno = int(caseno_str) + except ValueError: + print("get case number error! please check if func name is test_xxx") + return False + return caseno + + def tearDown(self): + self.log.info(' END: CASE %s log \n\n' % str(self.case_no)) + self.driver.quit() + self.assertEqual([], self.verificationErrors)
\ No newline at end of file diff --git a/toasteruitest/ReadMe.txt b/toasteruitest/ReadMe.txt new file mode 100644 index 00000000000..38af738abdf --- /dev/null +++ b/toasteruitest/ReadMe.txt @@ -0,0 +1,44 @@ +Before running toaster test case, we need to have following pre-requisite: + +Pre-requisite: - +a) To run toaster follow below step: +1.Fetch the source code for yocto +git clone http://git.yoctoproject.org/git/poky + +2. run below command to initiate build environment +source oe-init-build-env + +3. Install the basic requirement for Toaster with the below given command- +sudo pip3 install -r <Location-of-toaster-file(toaster-requirements.txt)> +Example- sudo pip3 install -r /home/…. /poky/bitbake/toaster-requirements.txt + +4. Start the toaster +source toaster start + +b) To install selenium +$ sudo apt-get install scrot python-pip +$ sudo pip install selenium + +c) To test with Chrome browser and chromedriver +Download/install chrome on host +Download chromedriver from https://code.google.com/p/chromedriver/downloads/list according to your host type +put chromedriver in PATH, (e.g. /usr/bin/, provide permission to chromedriver) +set path for chromedriver +export path=$PATH:/usr/bin/chromedriver + +d) Necessary images to be built +1) core-image-minimal +2) core-image-sato +while building if it gives error please install other dependencies like gawk,chrpath,texinfo etc. + +e) Please copy contrib file as attached on path "poky/bitbake/lib/toaster" + +f) Please copy toasteruitest directory into poky/bitbake/lib/toaster +then goto +"poky/bitbake/lib/toaster/toasteruitest" and run "./run_toastertests.py" from that location. + + +NOTE: +1) Make sure your system should not be in locked/sleep mode at least for 1 hour. +2) Test case Number 900: Its not included as all are manual steps and its time consuming for now, It will be included in future release. +3) Test case Number 955,951: Since Ctrl+C is not working (bug id:12813)so that portion is not implemented as of now. diff --git a/toasteruitest/Utility.py b/toasteruitest/Utility.py new file mode 100644 index 00000000000..78c99624c16 --- /dev/null +++ b/toasteruitest/Utility.py @@ -0,0 +1,272 @@ +#!/usr/bin/python +# +# DESCRIPTION +# This is script consist of common utils like sorting, getting attribute and so on. +# These modules are used for running all selected toaster cases +# on selected web browser manifested in toaster_test.cfg +# + +import errno +import logging +import os +import re +import sys + +class Listattr(object): + """ + Set of list attribute. This is used to determine what the list content is. + Later on we may add more attributes here. + """ + NULL = "null" + NUMBERS = "numbers" + STRINGS = "strings" + PERCENT = "percentage" + SIZE = "size" + UNKNOWN = "unknown" + +def get_log_root_dir(): + max_depth = 5 + parent_dir = '../' + for number in range(0, max_depth): + if os.path.isdir(sys.path[0] + os.sep + (os.pardir + os.sep)*number + 'log'): + log_root_dir = os.path.abspath(sys.path[0] + os.sep + (os.pardir + os.sep)*number + 'log') + break + + if number == (max_depth - 1): + print('No log dir found. Please check') + raise Exception + + return log_root_dir + +def get_list_attr(testlist): + """ + To determine the list content + """ + if not testlist: + return Listattr.NULL + listtest = testlist[:] + try: + listtest.remove('') + except ValueError: + pass + pattern_percent = re.compile(r"^([0-9])+(\.)?([0-9])*%$") + pattern_size = re.compile(r"^([0-9])+(\.)?([0-9])*( )*(K)*(M)*(G)*B$") + pattern_number = re.compile(r"^([0-9])+(\.)?([0-9])*$") + def get_patterned_number(pattern, tlist): + count = 0 + for item in tlist: + if re.search(pattern, item): + count += 1 + return count + if get_patterned_number(pattern_percent, listtest) == len(listtest): + return Listattr.PERCENT + elif get_patterned_number(pattern_size, listtest) == len(listtest): + return Listattr.SIZE + elif get_patterned_number(pattern_number, listtest) == len(listtest): + return Listattr.NUMBERS + else: + return Listattr.STRINGS + +def is_list_sequenced(testlist): + """ + Function to tell if list is sequenced + Currently we may have list made up of: Strings ; numbers ; percentage ; time; size + Each has respective way to determine if it's sequenced. + """ + test_list = testlist[:] + try: + test_list.remove('') + except ValueError: + pass + + if get_list_attr(testlist) == Listattr.NULL : + return True + + elif get_list_attr(testlist) == Listattr.STRINGS : + return (sorted(test_list) == test_list) + + elif get_list_attr(testlist) == Listattr.NUMBERS : + list_number = [] + for item in test_list: + list_number.append(eval(item)) + return (sorted(list_number) == list_number) + + elif get_list_attr(testlist) == Listattr.PERCENT : + list_number = [] + for item in test_list: + list_number.append(eval(item.strip('%'))) + return (sorted(list_number) == list_number) + + elif get_list_attr(testlist) == Listattr.SIZE : + list_number = [] + # currently SIZE is splitted by space + for item in test_list: + if item.split()[1].upper() == "KB": + list_number.append(1024 * eval(item.split()[0])) + elif item.split()[1].upper() == "MB": + list_number.append(1024 * 1024 * eval(item.split()[0])) + elif item.split()[1].upper() == "GB": + list_number.append(1024 * 1024 * 1024 * eval(item.split()[0])) + else: + list_number.append(eval(item.split()[0])) + return (sorted(list_number) == list_number) + + else: + print('Unrecognized list type, please check') + return False + + +def is_list_inverted(testlist): + """ + Function to tell if list is inverted + Currently we may have list made up of: Strings ; numbers ; percentage ; time; size + Each has respective way to determine if it's inverted. + """ + test_list = testlist[:] + try: + test_list.remove('') + except ValueError: + pass + + if get_list_attr(testlist) == Listattr.NULL : + print ("is_list_inverted ---> 1") + return True + + elif get_list_attr(testlist) == Listattr.STRINGS : + print ("is_list_inverted ---> 2") + return (sorted(test_list, reverse = True) == test_list) + print ("is_list_inverted ---> 3") + + elif get_list_attr(testlist) == Listattr.NUMBERS : + print ("is_list_inverted ---> 4") + list_number = [] + for item in test_list: + list_number.append(eval(item)) + return (sorted(list_number, reverse = True) == list_number) + + elif get_list_attr(testlist) == Listattr.PERCENT : + print ("is_list_inverted ---> 5") + list_number = [] + for item in test_list: + list_number.append(eval(item.strip('%'))) + return (sorted(list_number, reverse = True) == list_number) + + elif get_list_attr(testlist) == Listattr.SIZE : + print ("is_list_inverted ---> 6") + list_number = [] + # currently SIZE is splitted by space. such as 0 B; 1 KB; 2 MB + for item in test_list: + if item.split()[1].upper() == "KB": + list_number.append(1024 * eval(item.split()[0])) + elif item.split()[1].upper() == "MB": + list_number.append(1024 * 1024 * eval(item.split()[0])) + elif item.split()[1].upper() == "GB": + list_number.append(1024 * 1024 * 1024 * eval(item.split()[0])) + else: + list_number.append(eval(item.split()[0])) + return (sorted(list_number, reverse = True) == list_number) + + else: + print ("is_list_inverted ---> 7") + print('Unrecognized list type, please check') + return False + +def replace_file_content(filename, item, option): + f = open(filename) + lines = f.readlines() + f.close() + output = open(filename, 'w') + for line in lines: + if line.startswith(item): + output.write(item + " = '" + option + "'\n") + else: + output.write(line) + output.close() + +def extract_number_from_string(s): + """ + extract the numbers in a string. return type is 'list' + """ + return re.findall(r'([0-9]+)', s) + +def mkdir_p(dir): + try: + os.makedirs(dir) + except OSError as exc: + if exc.errno == errno.EEXIST and os.path.isdir(dir): + pass + else: + raise + +# Below is decorator derived from toaster backend test code +class NoParsingFilter(logging.Filter): + def filter(self, record): + return record.levelno == 100 + +#rewrite the run method of unittest.TestCase to add testcase logging +def LogResults(original_class): + orig_method = original_class.run + + from time import strftime, gmtime + caller = 'toaster' + timestamp = strftime('%Y%m%d%H%M%S', gmtime()) + logfile = os.path.join(os.getcwd(), 'results-' + caller + '.' + timestamp + '.log') + linkfile = os.path.join(os.getcwd(), 'results-' + caller + '.log') + + # rewrite the run method of unittest.TestCase to add testcase logging + def run(self, result, *args, **kws): + orig_method(self, result, *args, **kws) + passed = True + testMethod = getattr(self, self._testMethodName) + # if test case is decorated then use it's number, else use it's name + try: + test_case = testMethod.test_case + except AttributeError: + test_case = self._testMethodName + + class_name = str(testMethod.im_class).split("'")[1] + + # create custom logging level for filtering. + custom_log_level = 100 + logging.addLevelName(custom_log_level, 'RESULTS') + + def results(self, message, *args, **kws): + if self.isEnabledFor(custom_log_level): + self.log(custom_log_level, message, *args, **kws) + + logging.Logger.results = results + + logging.basicConfig(filename=logfile, + filemode='w', + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%H:%M:%S', + level=custom_log_level) + for handler in logging.root.handlers: + handler.addFilter(NoParsingFilter()) + local_log = logging.getLogger(caller) + + # check status of tests and record it + for (name, msg) in result.errors: + if (self._testMethodName == str(name).split(' ')[0]) and (class_name in str(name).split(' ')[1]): + local_log.results("Testcase " + str(test_case) + ": ERROR") + local_log.results("Testcase " + str(test_case) + ":\n" + msg) + passed = False + for (name, msg) in result.failures: + if (self._testMethodName == str(name).split(' ')[0]) and (class_name in str(name).split(' ')[1]): + local_log.results("Testcase " + str(test_case) + ": FAILED") + local_log.results("Testcase " + str(test_case) + ":\n" + msg) + passed = False + for (name, msg) in result.skipped: + if (self._testMethodName == str(name).split(' ')[0]) and (class_name in str(name).split(' ')[1]): + local_log.results("Testcase " + str(test_case) + ": SKIPPED") + passed = False + if passed: + local_log.results("Testcase " + str(test_case) + ": PASSED") + + # Create symlink to the current log + if os.path.exists(linkfile): + os.remove(linkfile) + os.symlink(logfile, linkfile) + + original_class.run = run + return original_class
\ No newline at end of file diff --git a/toasteruitest/__init__.py b/toasteruitest/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/toasteruitest/__init__.py diff --git a/toasteruitest/run_toastertests.py b/toasteruitest/run_toastertests.py new file mode 100644 index 00000000000..dffb3d995fa --- /dev/null +++ b/toasteruitest/run_toastertests.py @@ -0,0 +1,114 @@ +#!/usr/bin/python +# +# DESCRIPTION +# This is main script for running all selected toaster cases +# on selected web browser manifested in toaster_test.cfg +# + +import argparse +import ConfigParser +import os +import platform +import sys +from toaster_automation_test import toaster_cases +import unittest + +def get_args_parser(): + description = "Script that runs toaster auto tests." + parser = argparse.ArgumentParser(description=description) + parser.add_argument('--run-all-tests', required=False, action="store_true", dest="run_all_tests", default=False, + help='Run all tests.') + parser.add_argument('--run-suite', required=False, dest='run_suite', default=False, + help='run suite (defined in cfg file)') + return parser + +def get_tests(): + testslist = [] + prefix = 'toaster_automation_test.toaster_cases' + for t in dir(toaster_cases): + if t.startswith('test_'): + testslist.append('.'.join((prefix, t))) + return testslist + +def get_tests_from_cfg(suite=None): + + testslist = [] + config = ConfigParser.SafeConfigParser() + config.read('toaster_test.cfg') + + if suite is not None: + target_suite = suite.lower() + else: + target_suite = platform.system().lower() + try: + tests_from_cfg = eval(config.get('toaster_test_' + target_suite, 'test_cases')) + except: + print('Failed to get test cases from cfg file. Make sure the format is correct.') + return None + + prefix = 'toaster_automation_test.toaster_cases.test_' + for t in tests_from_cfg: + testslist.append(prefix + str(t)) + return testslist + +def buildResultClass(args): + """Build a Result Class to use in the testcase execution""" + class StampedResult(unittest.TextTestResult): + """ + Custom TestResult that prints the time when a test starts. As toaster-auto + can take a long time (ie a few hours) to run, timestamps help us understand + what tests are taking a long time to execute. + """ + def startTest(self, test): + import time + self.stream.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " - ") + super(StampedResult, self).startTest(test) + return StampedResult + +def main(): + + os.chdir(os.path.abspath(sys.path[0])) + parser = get_args_parser() + args = parser.parse_args() + + if args.run_all_tests: + testslist = get_tests() + elif args.run_suite: + testslist = get_tests_from_cfg(args.run_suite) + os.environ['TOASTER_SUITE'] = args.run_suite + else: + testslist = get_tests_from_cfg() + + if not testslist: + print('Failed to get test cases.') + exit(1) + + suite = unittest.TestSuite() + loader = unittest.TestLoader() + loader.sortTestMethodsUsing = None + runner = unittest.TextTestRunner(verbosity=2, resultclass=buildResultClass(args)) + for test in testslist: + try: + suite.addTests(loader.loadTestsFromName(test)) + except: + return 1 + + result = runner.run(suite) + + if result.wasSuccessful(): + return 0 + else: + return 1 + +if __name__ == "__main__": + + try: + ret = main() + except: + ret = 1 + import traceback + traceback.print_exc() + finally: + if os.getenv('TOASTER_SUITE'): + del os.environ['TOASTER_SUITE'] + sys.exit(ret)
\ No newline at end of file diff --git a/toasteruitest/toaster_automation_test.py b/toasteruitest/toaster_automation_test.py new file mode 100644 index 00000000000..e3e5d7f0671 --- /dev/null +++ b/toasteruitest/toaster_automation_test.py @@ -0,0 +1,1789 @@ +#!/usr/bin/python +# +# DESCRIPTION +# This script has toaster_cases class which includes all test cases. +# +import Base_Utility +#from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import Select +from selenium.webdriver.common.action_chains import ActionChains +import time +import Utility + +class toaster_cases(Base_Utility.toaster_cases_base): + + def test_901(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_partial_link_text('builds').click() + option_ids = ['checkbox-started_on', 'checkbox-failed_tasks', \ + 'checkbox-errors_no', 'checkbox-warnings_no', 'checkbox-time', 'checkbox-image_files', \ + 'checkbox-project'] + self.driver.find_element_by_id("edit-columns-button").click() + for item in option_ids: + if not self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + sorted_column = {'outcome': 1, 'machine': 3, 'completed_on': 4, 'errors_no': 6, 'warnings_no': 8,'project':11} + for key in sorted_column: + self.driver.find_element_by_xpath("//a[@data-sort-field='" + key + "']").click() + time.sleep(3) + column_list = self.get_table_column_text_by_column_number('allbuildstable',int(sorted_column[key])) + time.sleep(3) + if (int(sorted_column[key])!=1): + self.assertTrue(Utility.is_list_inverted(column_list) or Utility.is_list_sequenced(column_list), + msg=("list not in sequence order or not inverted for %d columns" %int(sorted_column[key]))) + self.driver.find_element_by_xpath("//a[@data-sort-field='" + key + "']").click() + time.sleep(3) + column_list = self.get_table_column_text_by_column_number('allbuildstable', int(sorted_column[key])) + if (int(sorted_column[key]) != 1): + self.assertTrue(Utility.is_list_inverted(column_list) or Utility.is_list_sequenced(column_list), + msg=("list not in sequence order or not inverted for %d columns" % int(sorted_column[key]))) + time.sleep(2) + self.log.info("case passed") + + def test_902(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + patterns = ["minimal"] + self.driver.find_element_by_partial_link_text('builds').click() + for pattern in patterns: + self.driver.find_element_by_id("search-input-allbuildstable").clear() + self.driver.find_element_by_id("search-input-allbuildstable").send_keys(pattern) + self.driver.find_element_by_id("search-submit-allbuildstable").click() + time.sleep(3) + new_target_column_texts = self.get_table_column_text('class', 'target') + time.sleep(3) + if new_target_column_texts: + for text in new_target_column_texts: + self.assertTrue(text.find(pattern), msg=("%s item doesn't exist " % pattern)) + self.driver.find_element_by_xpath("(//span[@class='remove-search-btn-allbuildstable glyphicon glyphicon-remove-circle'])[2]").click() + time.sleep(2) + self.assertTrue(self.driver.find_element_by_xpath("//h1[@class='top-air']").text == 'All builds',msg=("All builds not found after clear search" )) + self.log.info("case passed") + def test_903(self): + self.case_no = self.get_case_number() + image_type1 = "core-image-minimal" + image_type2 = "core-image-sato" + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_partial_link_text('builds').click() + if (self.driver.find_element_by_xpath("//h1[@class='top-air']").text == 'All builds'): + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-started_on").click() + self.driver.find_element_by_id("edit-columns-button").click() + items = ["Outcome", "Completed on", "Started on", 'Failed tasks'] + for item in items: + try: + temp_element = self.find_element_by_text_in_table('allbuildstable', item) + time.sleep(3) + self.assertTrue(temp_element.find_element_by_xpath( + "//a[@data-filter-on='outcome_filter']/i[@class='glyphicon glyphicon-filter filtered']")) + except Exception as e: + self.assertFalse(True, msg=(" %s cannot be found! %s" % (item, e))) + raise + filter_list = ['outcome_filter', 'started_on_filter', 'completed_on_filter','failed_tasks_filter'] + for key in filter_list: + self.driver.find_element_by_xpath("//*[@id='" + key + "']/i").click() + time.sleep(2) + self.driver.find_element_by_xpath("(//label[contains(@for,'" + key + "')] // input[ @ type = 'radio'])[3]").click() + time.sleep(2) + self.driver.find_element_by_xpath("//button[@class='btn btn-primary']").click() + time.sleep(2) + self.driver.find_element_by_id("search-input-allbuildstable").clear() + self.driver.find_element_by_id("search-input-allbuildstable").send_keys(image_type1) + time.sleep(2) + self.driver.find_element_by_id("search-submit-allbuildstable").click() + self.driver.find_element_by_xpath("//*[@id='" + key + "']/i").click() + time.sleep(2) + avail_options = self.driver.find_elements_by_xpath("//label[@class='filter-title']") + radio_button = self.driver.find_element_by_xpath("//*[@id='" + key + ":all']") + self.driver.find_element_by_xpath( + "//*[@id='filter-modal-allbuildstable']/div/div/div[1]/button").click() + time.sleep(2) + if (radio_button.is_selected()): + pass + else: + self.assertFalse(True, msg=("Error: All option is not selected after search")) + self.log.info("case passed") + def test_904(self): + Expected_BreadCrumb_Number = 4 + BreadCrumb_String = ["Builds", "core-image-minimal"] + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + Table_id = ['buildtaskstable', 'buildtimetable', 'buildcputimetable', 'buildiotable'] + self.driver.find_element_by_partial_link_text("core-image-minimal").click() + Checkbox_Table = ["checkbox-order", "checkbox-recipe__name", "checkbox-task_name", + 'checkbox-recipe__version', + "checkbox-task_executed", "checkbox-outcome", "checkbox-sstate_result", + 'checkbox-elapsed_time', + 'checkbox-cpu_time_system', 'checkbox-cpu_time_user', 'checkbox-disk_io'] + Shows_Rows_Id = ['table-chrome-collapse-buildtaskstable', 'table-chrome-collapse-buildtimetable', + 'table-chrome-collapse-buildcputimetable', 'table-chrome-collapse-buildiotable'] + Ui_List = ["Tasks", "Time", "CPU usage", "Disk I/O"] + SeacrhTaskTable = ['search-input-buildtaskstable', 'search-input-buildtimetable', + 'search-input-buildcputimetable', 'search-input-buildiotable'] + Expected_Edit_List = {'Tasks': ['Order', 'Recipe', 'Task', 'Executed', 'Outcome', 'Cache attempt'], + 'Time': ['Recipe', 'Task', 'Executed', 'Outcome', 'Time (secs)'], + "CPU usage": ['Recipe', 'Task', 'Executed', 'Outcome', 'System CPU time (secs)', + 'User CPU time (secs)'], + 'Disk I/O': ['Recipe', 'Task', 'Executed', 'Outcome', 'Disk I/O (ms)']} + count = 0 + for item in Ui_List: + self.driver.find_element_by_link_text(item).click() + Total_BreadCrumb_Link = len(self.driver.find_elements_by_xpath("//*[@id='breadcrumb']/li")) + if (Total_BreadCrumb_Link == Expected_BreadCrumb_Number): + for i in range(1, Total_BreadCrumb_Link): + BreadCrumb_Name = self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[%d]/a" % i).text + self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[%d]/a" % i).click() + self.driver.back() + Active_BreadCrumb_Link = self.driver.find_element_by_xpath("(//*[@id='breadcrumb']/li)[4]").text + if (Active_BreadCrumb_Link == "Tasks"): + pass + else: + self.assertTrue(Active_BreadCrumb_Link, msg=("Active breadcrumb is not correct")) + else: + self.assertTrue(Total_BreadCrumb_Link, msg=("Total Breadcrumb link is not as expected")) + Total_Number_SideLink = len(self.driver.find_elements_by_xpath("//*[@id='nav']//li/a")) + for i in range(1, (Total_Number_SideLink - 2)): + time.sleep(5) + self.driver.find_element_by_xpath("(//*[@id='nav']//li/a)[%d]" % i).click() + time.sleep(2) + self.driver.back() + Active_Class_Name = self.driver.find_element_by_xpath("//*[@id='build-menu']/li[@class='active']/a").text + if (Active_Class_Name == item): + pass + else: + self.assertFalse(Active_Class_Name, msg=("Active class not correctly diaplyed")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='" + SeacrhTaskTable[count] + "']"), + msg=("search tab not found on page")) + self.assertTrue(self.driver.find_element_by_xpath( + "//*[@id='" + SeacrhTaskTable[count] + "'][@placeholder='Search tasks']"), + msg=("search Placeholder is search tasks")) + self.driver.find_element_by_xpath("//*[@id='" + SeacrhTaskTable[count] + "']").click() + self.driver.find_element_by_xpath("//*[@id='" + SeacrhTaskTable[count] + "']").send_keys("busybox") + time.sleep(2) + self.driver.find_element_by_xpath("//button[@class='btn btn-default']").click() + time.sleep(2) + column_list_busybox = self.driver.find_elements_by_xpath("//a[text()='busybox']") + if (len(column_list_busybox) >= 1): + pass + else: + self.assertFalse(len(column_list_busybox),msg=("Error: Seacrh is not successful")) + self.driver.find_element_by_xpath("//*[@id='" + SeacrhTaskTable[count] + "']").click() + self.driver.find_element_by_xpath("(//span[contains(@class,'remove-search-btn')])[2]").click() + edit_Show_Rows = Select( + self.driver.find_element_by_xpath("//*[@id='" + Shows_Rows_Id[count] + "']/form[2]/div/select")) + selected_number_rows = "25" + edit_Show_Rows.select_by_value(selected_number_rows) + time.sleep(5) + Total_Row_Num = len( + self.driver.find_elements_by_xpath("//table[@class='table table-bordered table-hover']/tbody/tr")) + if selected_number_rows != Total_Row_Num: + self.assertTrue(Total_Row_Num, msg=("Total number of rows slected are not correct")) + else: + pass + self.assertTrue(self.driver.find_elements_by_xpath("//ul[@class='pagination']/li"), + msg=("Pagination Link not available")) + self.assertTrue(self.driver.find_element_by_xpath("(//form[@class='navbar-form navbar-right'])[2]"), + msg=("Shows Rows option not available at bottom of page")) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + Edit_Element = self.driver.find_elements_by_xpath("//*[@class='dropdown-menu editcol']//li//div") + Edit_Check_List = [] + for element in Edit_Element: + Edit_Check_List.append(element.text) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + Actual_Checked_List = [] + for item1 in Checkbox_Table: + value = self.driver.find_element_by_id(item1).is_selected() + if value: + Actual_Checked_List.append(self.driver.find_element_by_id(item1).find_element_by_xpath('..').text) + result = all(elem in Actual_Checked_List for elem in Expected_Edit_List[item]) + if result: + pass + else: + self.assertTrue(result, msg=("Error:Edit column list not found as expected")) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + Edit_Element = self.driver.find_elements_by_xpath("//*[@class='dropdown-menu editcol']//li//div") + Edit_Check_List = [] + edit_number = 1 + for element in Edit_Element: + Edit_Check_List.append(element.text) + Displayed_coulmn_number = len( + self.driver.find_elements_by_xpath("//th[contains(@style,'display: none;')]")) + self.driver.find_element_by_xpath("(//input[@type='checkbox'])[%d]" % edit_number).click() + time.sleep(10) + Displayed_coulmn_number_after_click = len( + self.driver.find_elements_by_xpath("//th[contains(@style,'display: none;')]")) + if (Displayed_coulmn_number == Displayed_coulmn_number_after_click): + pass + else: + self.driver.find_element_by_xpath("(//input[@type='checkbox'])[%d]" % edit_number).click() + edit_number = edit_number + 1 + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + for item1 in Checkbox_Table: + if not self.driver.find_element_by_id(item1).is_selected(): + self.driver.find_element_by_id(item1).click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + if (item == 'Tasks'): + if self.driver.find_element_by_xpath("//*[@id='buildtaskstable']/thead/tr/th[1]/a").text == 'Order': + pass + else: + self.assertFalse(True, msg=("Error: Order is not bold")) + self.assertTrue(self.driver.find_element_by_xpath("//*[@id='buildtaskstable']/thead/tr/th[1]/i[1]"), + msg=' down-arrow icon are not present ') + default_column_list = self.get_table_column_text_by_column_number('buildtaskstable', 1) + self.assertTrue(Utility.is_list_sequenced(default_column_list), + msg=("list not in sequence for corresponding column")) + Column_Head_Len = len( + self.driver.find_elements_by_xpath("//*[@id='" + Table_id[count] + "']/thead/tr/th")) + for i in range(2, Column_Head_Len): + if (i >= 4): + i = i + 1 + self.driver.find_element_by_xpath("//*[@id='" + Table_id[count] + "']/thead/tr/th[%d]/a" % i).click() + time.sleep(10) + column_list = self.get_table_column_text_by_column_number(Table_id[count], i) + self.assertTrue(Utility.is_list_sequenced(column_list) or Utility.is_list_inverted(column_list), + msg=("list not in sequence not inverted for corresponding order")) + + filter_list = ['execution_outcome', 'task_outcome', 'sstate_outcome'] + filter_column_number = 5 + for key in filter_list: + self.driver.find_element_by_xpath("//*[@id='" + key + "']/i").click() + time.sleep(2) + avail_options = self.driver.find_elements_by_xpath("//label[@class='filter-title']") + radio_button = self.driver.find_element_by_xpath("//*[@id='" + key + ":all']") + self.driver.find_element_by_xpath( + "/html/body/div[3]/div[3]/div[2]/div/div[2]/div/div/div[1]/button").click() + time.sleep(2) + if (radio_button.is_selected()): + pass + else: + self.assertFalse(True, msg=("Error: All option is not selected before channging")) + for number in range(2, (len(avail_options)) + 1): + self.driver.find_element_by_xpath("//*[@id='" + key + "']/i").click() + time.sleep(2) + if ((number == 4 or number == 5 or number == 6) and key == 'task_outcome'): + number = 7 + if ((number == 4 or number == 5) and key == 'sstate_outcome'): + break + self.driver.find_element_by_xpath("(//input[@type='radio'])[%d]" % number).click() + time.sleep(2) + if (number == 7 and key == 'task_outcome'): + number = 4 + match = self.driver.find_element_by_xpath("(//label[@class='filter-title'])[%d]" % number) + self.driver.find_element_by_xpath("//button[@class='btn btn-primary']").click() + time.sleep(2) + column_list = self.get_table_column_text_by_column_number(Table_id[count], filter_column_number) + column_list_set = set(column_list) + column_list_converted = list(column_list_set) + if (str(column_list_converted[0]) != ''): + if (str(match.text)).find(str(column_list_converted[0])): + pass + else: + self.assertFalse(True, msg=("Error: All option is not selected before channging")) + if (number == 4 and key == 'task_outcome'): + break + self.driver.find_element_by_xpath("//*[@id='" + key + "']/i").click() + time.sleep(2) + self.driver.find_element_by_xpath("(//input[@type='radio'])[1]").click() + time.sleep(2) + self.driver.find_element_by_xpath("//button[@class='btn btn-primary']").click() + time.sleep(2) + self.driver.find_element_by_xpath("//*[@id='" + key + "']/i").click() + time.sleep(2) + radio_button_selected = self.driver.find_element_by_xpath("//*[@id='" + key + ":all']") + if (radio_button_selected.is_selected()): + pass + else: + self.assertFalse(True, msg=("Error:All option is not selected after chnages")) + self.driver.find_element_by_xpath( + "/html/body/div[3]/div[3]/div[2]/div/div[2]/div/div/div[1]/button").click() + time.sleep(2) + filter_column_number = filter_column_number + 1 + Row_Len = len(self.driver.find_elements_by_xpath("//*[@id='" + Table_id[count] + "']/tbody/tr")) + time.sleep(2) + for row_number in range(1, Row_Len + 1): + self.driver.find_element_by_xpath( + "//*[@id='" + Table_id[count] + "']/tbody/tr[%d]/td[2]/a" % row_number).click() + time.sleep(2) + self.driver.back() + time.sleep(2) + self.driver.find_element_by_xpath( + "//*[@id='" + Table_id[count] + "']/tbody/tr[%d]/td[3]/a" % row_number).click() + time.sleep(2) + self.driver.back() + time.sleep(2) + count = count + 1 + self.log.info("case passed") + + def test_906(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + Expected_BreadCrumb_Number = 5 + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Packages').click() + self.driver.find_element_by_xpath("//*[@id='builtpackagestable']/tbody/tr[1]/td[1]/a").click() + Total_BreadCrumb_Link = len(self.driver.find_elements_by_xpath("//*[@id='breadcrumb']/li")) + if (Total_BreadCrumb_Link == Expected_BreadCrumb_Number): + for i in range(1, Total_BreadCrumb_Link): + BreadCrumb_Name = self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[%d]/a" % i).text + self.assertTrue(BreadCrumb_Name != '', msg="Breaccrum name not available") + self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[%d]/a" % i).click() + self.driver.back() + time.sleep(2) + else: + self.assertFalse(True, msg=("Error:Total Breadcrumb link is not as expected")) + self.driver.find_element_by_xpath("(//ul[@class='breadcrumb']//li)[4]").click() + time.sleep(1) + self.driver.find_element_by_xpath("//*[@id='builtpackagestable']/tbody/tr[1]/td[1]/a").click() + time.sleep(1) + name_package=self.driver.find_element_by_xpath("//div[@class='tab-content']//div[@class='tab-pane active']//div").text + if 'Package included in' in name_package: + self.driver.find_element_by_xpath("//div[@class='well']") + self.driver.find_element_by_xpath("//div[@class='page-header build-data']") + else: + if ('Generated files' in self.driver.find_element_by_xpath("(//div[@class='col-md-8 tabbable']/ul/li/a)[1]").text): + pass + else: + self.assertFalse(True, msg=("Error correct active string not diaplyed")) + if ('Runtime dependencies' in self.driver.find_element_by_xpath("(//div[@class='col-md-8 tabbable']/ul/li/a)[2]").text): + pass + else: + self.assertFalse(True, msg=("Error correct string not diaplyed in 2nd tab")) + self.driver.find_element_by_partial_link_text("Generated files").click() + string_generated_file = self.driver.find_element_by_xpath("/html/body/div[3]/div[3]/div[1]/ul/li[1]/a").text + generate_files_row_number = len(self.driver.find_elements_by_xpath( + "//table[@class='table table-bordered table-hover tablesorter']/tbody/tr")) + expected_value_generated_files = (((string_generated_file.split()[2]).split('(')[1]).split(')'))[0] + if (int(expected_value_generated_files)>0): + if (generate_files_row_number == int(expected_value_generated_files) ): + head_list = self.get_table_head_text('otable') + for item in ['File', 'Size']: + self.assertTrue(item in head_list, msg=("%s not in head row" % item)) + c_list = self.get_table_column_text('class', 'path') + self.assertTrue(Utility.is_list_sequenced(c_list), msg=("column not in order")) + else: + self.assertFalse(True, msg=("Error: row number is not correct for generated files")) + self.driver.find_element_by_partial_link_text("Runtime dependencies").click() + string_runtime_dependencies = self.driver.find_element_by_xpath( + "/html/body/div[3]/div[3]/div[1]/ul/li[2]/a").text + runtime_dependencies_row_number = len( + self.driver.find_elements_by_xpath("//table[@class='table table-bordered table-hover']/tbody/tr")) + expected_value_runtime_dependencies = (((string_runtime_dependencies.split()[2]).split('(')[1]).split(')'))[ + 0] + if (int(expected_value_runtime_dependencies) > 0): + if (runtime_dependencies_row_number == int(expected_value_runtime_dependencies)): + head_list = self.get_table_head_text('dependencies') + for item in ['Package', 'Version', 'Size']: + self.assertTrue(item in head_list, msg=("%s not in head row" % item)) + c_list = self.get_table_column_text_by_column_number('dependencies', 1) + self.assertTrue(Utility.is_list_sequenced(c_list), msg=("list not in order")) + else: + self.assertFalse(True, msg=("Error: row number is not correct for runtime dependencies")) + texts = ['Size', 'License', 'Recipe', 'Recipe version', 'Layer', 'Layer'' commit'] + if (len(self.driver.find_elements_by_xpath( + "//dl//span[@class='glyphicon glyphicon-question-sign get-help']")) == 7): + pass + else: + self.assertFalse(True, msg=("Error: total number of help option is not correct")) + self.failUnless(self.is_text_present(texts)) + time.sleep(3) + self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[4]/a").click() + time.sleep(3) + self.driver.find_element_by_id("search-input-builtpackagestable").click() + self.driver.find_element_by_id("search-input-builtpackagestable").send_keys("busybox") + self.driver.find_element_by_id("search-submit-builtpackagestable").click() + time.sleep(2) + self.driver.find_element_by_xpath("//*[@id='builtpackagestable']/tbody/tr[1]/td[1]/a").click() + if (self.driver.find_element_by_xpath("//div[@class='lead well']").text != ''): + self.driver.find_element_by_xpath("//div[@class='lead well']").click() + self.log.info("case passed") + def test_910(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + image_type = "core-image-minimal" + test_package1 = "busybox" + test_package2 = "lib" + section_column_number = 6 + self.driver.find_element_by_link_text(image_type).click() + self.driver.find_element_by_link_text("Recipes").click() + default_column_list = self.get_table_column_text_by_column_number('builtrecipestable', 1) + self.assertTrue(Utility.is_list_sequenced(default_column_list), + msg=("list not in sequence order deafault column Recipes")) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + self.driver.find_element_by_id("checkbox-section").click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + self.driver.find_element_by_xpath("//th[@class='section']/a").click() + time.sleep(2) + column_list_after_section = self.get_table_column_text_by_column_number('builtrecipestable', + section_column_number) + self.assertTrue(Utility.is_list_sequenced(column_list_after_section)) + self.driver.find_element_by_id("search-input-builtrecipestable").click() + self.driver.find_element_by_id("search-input-builtrecipestable").send_keys(test_package1) + self.driver.find_element_by_xpath("//button[@class='btn btn-default']").click() + time.sleep(2) + self.driver.find_element_by_id("search-input-builtrecipestable").click() + time.sleep(2) + self.driver.find_element_by_xpath( + "//*[@id='table-chrome-collapse-builtrecipestable']/form[1]/div/div/span").click() + time.sleep(2) + column_list_Section_after_search = self.get_table_column_text_by_column_number('builtrecipestable', + section_column_number) + self.assertTrue(Utility.is_list_sequenced(column_list_Section_after_search)) + option_ids = ['checkbox-name', 'checkbox-version', \ + 'checkbox-dependencies', 'checkbox-revdeps', 'checkbox-file_path', 'checkbox-section', \ + 'checkbox-license', 'checkbox-layer_version__layer__name', 'checkbox-layer_version__branch', + 'checkbox-commit'] + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + for item1 in option_ids: + if not self.driver.find_element_by_id(item1).is_selected(): + self.driver.find_element_by_id(item1).click() + time.sleep(2) + + self.driver.find_element_by_id("edit-columns-button").click() + column_head = ['Recipe', 'Section', 'License', 'Layer', 'Layer branch'] + column_number = 1 + for item in column_head: + time.sleep(2) + self.find_element_by_link_text_in_table('builtrecipestable', item).click() + time.sleep(2) + if column_number == 2: + column_number = section_column_number + column_list_packages = self.get_table_column_text_by_column_number('builtrecipestable', column_number) + self.assertTrue(Utility.is_list_sequenced(column_list_packages) or Utility.is_list_inverted(column_list_packages), + msg=("list not in sequence order or not inverted for %s columns" % item)) + column_number = column_number + 1 + self.find_element_by_link_text_in_table('builtrecipestable', 'Recipe').click() + time.sleep(2) + column_number = 1 + for item in column_head: + self.find_element_by_link_text_in_table('builtrecipestable', item).click() + time.sleep(2) + if column_number == 2: + column_number = section_column_number + column_list_packages = self.get_table_column_text_by_column_number('builtrecipestable', column_number) + self.assertTrue(Utility.is_list_sequenced(column_list_packages) or Utility.is_list_inverted(column_list_packages), + msg=("list not in sequence order or not inverted for %s columns before serach" % item)) + self.driver.find_element_by_id("search-input-builtrecipestable").click() + self.driver.find_element_by_id("search-input-builtrecipestable").send_keys(test_package2) + self.driver.find_element_by_xpath("//button[@class='btn btn-default']").click() + time.sleep(2) + column_list_packages_after_search = self.get_table_column_text_by_column_number('builtrecipestable',column_number) + self.assertTrue( + Utility.is_list_sequenced(column_list_packages_after_search) or Utility.is_list_inverted(column_list_packages), + msg=("list not in sequence order or not inverted for %s columns after serach" % item)) + self.driver.find_element_by_id("search-input-builtrecipestable").click() + time.sleep(2) + self.driver.find_element_by_xpath( + "//*[@id='table-chrome-collapse-builtrecipestable']/form[1]/div/div/span").click() + column_number = column_number + 1 + table_head_dict = {'Section': 'checkbox-section', 'License': 'checkbox-license', + 'Layer': 'checkbox-layer_version__layer__name', + 'Layer branch': 'checkbox-layer_version__branch'} + for key in table_head_dict: + self.find_element_by_link_text_in_table('builtrecipestable', key).click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id(table_head_dict[key]).click() + self.driver.find_element_by_id("edit-columns-button").click() + default_column_list = self.get_table_column_text_by_column_number('builtrecipestable', 1) + self.assertTrue(Utility.is_list_sequenced(default_column_list), + msg=("list not in sequence order deafault column Recipes")) + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id('checkbox-license').click() + time.sleep(2) + self.driver.find_element_by_id('checkbox-layer_version__layer__name').click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + self.log.info("case passed") + def test_911(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + searched_recipies = 'hfidf' + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Recipes').click() + self.driver.find_element_by_xpath("//*[@placeholder='Search recipes built']") + self.driver.find_element_by_id("search-input-builtrecipestable") + time.sleep(5) + self.driver.find_element_by_id("search-input-builtrecipestable").clear() + self.driver.find_element_by_id("search-input-builtrecipestable").send_keys("lib") + time.sleep(5) + self.driver.find_element_by_id("search-submit-builtrecipestable").click() + time.sleep(3) + seacrhed_string = self.driver.find_element_by_xpath("//div[@class='page-header build-data']").text + seacrhed_string_value = int(((seacrhed_string.split()[2].split('(')[1].split(')'))[0])) + if (seacrhed_string_value == 0): + self.driver.find_element_by_id("new-search-input-builtrecipestable") + self.driver.find_element_by_xpath("//*[@id='no-results-builtrecipestable']/div/form/button[2]").click() + time.sleep(5) + elif (seacrhed_string_value > 0): + self.driver.find_element_by_id("search-submit-builtrecipestable").click() + time.sleep(5) + self.driver.find_element_by_xpath( + "//*[@id='table-chrome-collapse-builtrecipestable']/form[1]/div/div/span").click() + else: + self.assertFalse(True, msg=("Error: Searched text not found in expected output")) + head_list = self.get_table_head_text('builtrecipestable') + self.assertTrue(head_list == ['Recipe', 'Version', 'Dependencies', 'Reverse dependencies', 'License', 'Layer'], \ + msg=("head row contents wrong")) + head_list_sort = self.get_table_head_text('builtrecipestable') + self.find_element_by_link_text_in_table('builtrecipestable', 'Recipe').click() + time.sleep(7) + sort_list = self.get_table_column_text_by_column_number('builtrecipestable', 1) + self.assertTrue(Utility.is_list_inverted(sort_list), msg=("list not inverted")) + + self.driver.find_element_by_id("search-input-builtrecipestable").clear() + self.driver.find_element_by_id("search-input-builtrecipestable").send_keys("bash") + time.sleep(2) + self.driver.find_element_by_id("search-submit-builtrecipestable").click() + time.sleep(2) + head_list = self.get_table_head_text('builtrecipestable') + self.assertTrue(head_list == ['Recipe', 'Version', 'Dependencies', 'Reverse dependencies', 'License', 'Layer'], \ + msg=("head row contents wrong")) + head_list = self.get_table_head_text('builtrecipestable') + self.assertTrue(head_list == ['Recipe', 'Version', 'Dependencies', 'Reverse dependencies', 'License', 'Layer'], \ + msg=("head row contents wrong")) + sort_list = self.get_table_column_text_by_column_number('builtrecipestable', 1) + self.assertTrue(Utility.is_list_inverted(sort_list), msg=("list not in order")) + time.sleep(2) + self.driver.find_element_by_id("search-input-builtrecipestable").clear() + self.driver.find_element_by_xpath( + "//*[@id='table-chrome-collapse-builtrecipestable']/form[1]/div/div/span").click() + self.driver.find_element_by_id("search-input-builtrecipestable").clear() + self.driver.find_element_by_id("search-input-builtrecipestable").send_keys("no such input") + self.driver.find_element_by_id("search-submit-builtrecipestable").click() + time.sleep(3) + self.log.info("case passed") + def test_912(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Recipes').click() + head_list = self.get_table_head_text('builtrecipestable') + head = ['Recipe', 'Version', 'Dependencies', 'Reverse dependencies', 'License', 'Layer'] + time.sleep(3) + for item in head: + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-file_path']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-section']").click() + + self.driver.find_element_by_xpath("//*[@id='checkbox-layer_version__branch']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-commit']").click() + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + check_list = ['Dependencies', 'License', 'Recipe file', 'Section', 'Layer', 'Layer branch', 'Layer commit', + 'Reverse dependencies'] + head_list = self.get_table_head_text('builtrecipestable') + time.sleep(2) + for item in check_list: + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-dependencies']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-revdeps']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-file_path']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-section']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-license']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-layer_version__layer__name']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-layer_version__branch']").click() + self.driver.find_element_by_xpath("//*[@id='checkbox-commit']").click() + self.driver.find_element_by_id("edit-columns-button").click() + head_list = self.get_table_head_text('builtrecipestable') + for item in check_list: + self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item)) + self.log.info("case passed") + def test_913(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Recipes').click() + head_list = self.get_table_head_text('builtrecipestable') + for item in ['Recipe', 'Version', 'Dependencies', 'Reverse dependencies', 'License', 'Layer']: + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(10) + if (len(self.driver.find_elements_by_xpath("//label[@class='text-muted']")) == 2): + pass + else: + self.assertFalse(True, msg=("Fail: Muted element is not correct")) + time.sleep(1) + self.driver.find_element_by_id("edit-columns-button").click() + self.log.info("case passed") + def test_914(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + image_type = "core-image-minimal" + test_package2 = "gdbm" + No_dependecies_msg = "has no build dependencies." + No_dependecies_Pkg_msg = "does not build any packages." + No_Reverse_dependecies_msg = "has no reverse build dependencies." + Search_Build_List = ["gettext-native", "libtool-cross"] + self.driver.find_element_by_link_text(image_type).click() + self.driver.find_element_by_link_text("Recipes").click() + default_column_list = self.get_table_column_text_by_column_number('builtrecipestable', 1) + for row_number in range(1, len(default_column_list) + 1): + self.driver.find_element_by_xpath( + "// *[ @ id = 'builtrecipestable'] // tbody // tr[%d] // td // a[contains( @ href, 'recipe')]" % row_number).click() + time.sleep(2) + build_dependecies = self.driver.find_element_by_xpath("//a[@href='#dependencies']") + string_dependcies = str(build_dependecies.text) + build_dependecies_num = (int(((string_dependcies.split('('))[1].split(')'))[0])) + build_dependecies.click() + time.sleep(2) + if (build_dependecies_num > 0): + dependencies_length = len(self.driver.find_elements_by_xpath( + "(//table[@class='table table-bordered table-hover'])[2]//tbody//tr")) + if (dependencies_length == build_dependecies_num): + pass + else: + self.assertFalse(True, msg=("Error: Total number of dependencies are correct")) + else: + output_string1 = (self.driver.find_element_by_xpath("//div[@class='alert alert-info']").text) + if (No_dependecies_msg in output_string1): + pass + else: + self.assertFalse(True, msg=("Error: Not correct output string")) + time.sleep(2) + Reverse_build_dependecies = self.driver.find_element_by_xpath("//a[@href='#brought-in-by']") + Reverse_string_dependcies = str(Reverse_build_dependecies.text) + Reverse_build_dependecies_num = (int(((Reverse_string_dependcies.split('('))[1].split(')'))[0])) + Reverse_build_dependecies.click() + time.sleep(2) + if (Reverse_build_dependecies_num > 0): + Reverse_dependencies_length = len( + self.driver.find_elements_by_xpath("//*[@id='brought-in-by']/table/tbody/tr")) + if (Reverse_dependencies_length == Reverse_build_dependecies_num): + Column_number = len( + self.driver.find_elements_by_xpath("// *[@id ='brought-in-by']/table/thead/tr/th")) + for i in range(1, Reverse_dependencies_length + 1): + for j in range(1, Column_number + 1): + Reverse_Recipie_name = self.driver.find_element_by_xpath( + "//*[@id='brought-in-by']/table/tbody/tr[%d]/td[%d]" % (i, j)) + if (Reverse_Recipie_name.text != ''): + if (j == 1): + Reverse_Recipie_name_link = self.driver.find_element_by_xpath( + "//*[@id='brought-in-by']/table/tbody/tr[%d]/td[%d]/a" % (i, j)) + action = ActionChains(self.driver) + action.move_to_element(Reverse_Recipie_name_link).perform() + url = Reverse_Recipie_name_link.get_attribute("href") + self.assertTrue(url, + msg=("url not found for corresponding reverse dependencies")) + else: + self.assertFalse(True, msg=("Error! Corresponding name and size are not avaialbale for reverse build dependencies")) + else: + self.assertFalse(True, msg=("Error:Total number of Reverse dependencies are not correct")) + else: + output_string1 = (self.driver.find_element_by_xpath("//div[@class='alert alert-info']").text) + if (No_Reverse_dependecies_msg in output_string1): + pass + else: + self.assertFalse(True, msg=("Error: Correct output string has not been displayed")) + time.sleep(2) + if (row_number != (len(default_column_list))): + self.driver.back() + time.sleep(2) + self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[4]/a").click() + time.sleep(4) + self.driver.find_element_by_id("search-input-builtrecipestable").click() + self.driver.find_element_by_id("search-input-builtrecipestable").send_keys(test_package2) + self.driver.find_element_by_xpath("//button[@class='btn btn-default']").click() + time.sleep(2) + self.driver.find_element_by_xpath("//*[@id='builtrecipestable']/tbody/tr/td[1]/a").click() + Package_dependencies = self.driver.find_element_by_xpath("//a[contains(@href,'recipe_packages')]") + string_Package_dependencies = str(Package_dependencies.text) + Package_dependecies_num = (int(((string_Package_dependencies.split('('))[1].split(')'))[0])) + Package_dependencies.click() + time.sleep(2) + if (Package_dependecies_num > 0): + Package_edit_Show_Rows = Select( + self.driver.find_element_by_xpath("//*[@id='packages-built']/form[2]/div/select")) + selected_number_rows = "150" + Package_edit_Show_Rows.select_by_value(selected_number_rows) + time.sleep(5) + Package_dependendencies_length = len(self.driver.find_elements_by_xpath( + "//table[@class='table table-bordered table-hover tablesorter']/tbody/tr")) + if (Package_dependendencies_length == Package_dependecies_num): + pass + else: + self.assertFalse(True, msg=("Error: Total number of packages in searched recipie are not correct")) + else: + Package_output_string = (self.driver.find_element_by_xpath("//div[@class='alert alert-info']").text) + if (No_dependecies_Pkg_msg in Package_output_string): + pass + else: + self.assertFalse(True, msg=("Error : Correct output string not diaplyed for searched recipie")) + time.sleep(2) + Search_build_dependencies = self.driver.find_element_by_xpath("//a[contains(@href,'active_tab/3')]") + string_Search_dependencies = str(Search_build_dependencies.text) + Search_build_dependencies_num = (int(((string_Search_dependencies.split('('))[1].split(')'))[0])) + Search_build_dependencies.click() + time.sleep(5) + if (Search_build_dependencies_num > 0): + Searc_dependencies_length = len(self.driver.find_elements_by_xpath( + "(//table[@class='table table-bordered table-hover'])[2]//tbody//tr")) + if (Searc_dependencies_length == Search_build_dependencies_num): + pass + Search_Column_number_Dependencies = len( + self.driver.find_elements_by_xpath("// *[@id ='dependencies']/table/thead/tr/th")) + Search_Build_Recipies_List = [] + for i in range(1, Searc_dependencies_length + 1): + for j in range(1, Search_Column_number_Dependencies + 1): + Search_Recipie_name = self.driver.find_element_by_xpath( + "//*[@id='dependencies']/table/tbody/tr[%d]/td[%d]" % (i, j)) + if (Search_Recipie_name.text != ''): + if (j == 1): + Search_Recipie_name_link = self.driver.find_element_by_xpath( + "//*[@id='dependencies']/table/tbody/tr[%d]/td[%d]/a" % (i, j)) + Search_Build_Recipies_List.append(Search_Recipie_name_link.text) + action = ActionChains(self.driver) + action.move_to_element(Search_Recipie_name_link).perform() + time.sleep(2) + url = Search_Recipie_name_link.get_attribute("href") + self.assertTrue(url, msg=("url not found for search build dependencies")) + else: + self.assertFalse(True, msg=("Error! Corresponding name and size are not avaialbale for searched recipie build dependencies")) + result = all(elem in Search_Build_Recipies_List for elem in Search_Build_List) + if result: + pass + else: + self.assertFalse(True, msg=("Error:Serached list not found")) + else: + self.assertFalse(True, msg=("Error: Total number of dependencies in searched recipie are correct")) + time.sleep(2) + + Search_Reverse_build_dependencies = self.driver.find_element_by_xpath("//a[@href='#brought-in-by']") + Search_Reverse_string_dependencies = str(Search_Reverse_build_dependencies.text) + Search_Reverse_build_dependencies_num = ( + int(((Search_Reverse_string_dependencies.split('('))[1].split(')'))[0])) + Search_Reverse_build_dependencies.click() + time.sleep(2) + if (Search_Reverse_build_dependencies_num > 0): + Search_Reverse_dependencies_length = len( + self.driver.find_elements_by_xpath("//*[@id='brought-in-by']/table/tbody/tr")) + if (Search_Reverse_dependencies_length == Search_Reverse_build_dependencies_num): + Search_Reverse_Column_number = len( + self.driver.find_elements_by_xpath("// *[@id ='brought-in-by']/table/thead/tr/th")) + for i in range(1, Search_Reverse_dependencies_length + 1): + for j in range(1, Search_Reverse_Column_number + 1): + Search_Reverse_build_Recipie_name = self.driver.find_element_by_xpath( + "//*[@id='brought-in-by']/table/tbody/tr[%d]/td[%d]" % (i, j)) + if (j == 1): + Search_Reverse_Recipie_name_link = self.driver.find_element_by_xpath( + "//*[@id='brought-in-by']/table/tbody/tr[%d]/td[%d]/a" % (i, j)) + action = ActionChains(self.driver) + action.move_to_element(Search_Reverse_Recipie_name_link).perform() + time.sleep(2) + url = Search_Reverse_Recipie_name_link.get_attribute("href") + self.assertTrue(url, msg=("url not found for search reverse build dependencies")) + else: + self.assertFalse(True, msg=("Error: Total number of Reverse dependencies are not correct in serached recipies")) + if (Search_Reverse_build_dependencies_num == 0): + output_string1 = (self.driver.find_element_by_xpath("//div[@class='alert alert-info']").text) + if (No_Reverse_dependecies_msg in output_string1): + pass + else: + self.assertFalse(True, msg=("Error:Correct output string has been displayed for serached string")) + self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[3]/a").click() + self.driver.find_element_by_link_text("Packages").click() + time.sleep(2) + packages_num = self.driver.find_element_by_class_name("table-count-builtpackagestable").text + edit_Show_Rows = Select( + self.driver.find_element_by_xpath("(//select[@class='form-control pagesize-builtpackagestable'])[1]")) + selected_number_rows = "150" + edit_Show_Rows.select_by_value(selected_number_rows) + time.sleep(2) + Total_page_number=int(packages_num)/ int(selected_number_rows) + #Total_page_number = 4 + packages_row_count = 0 + page_navigation_link = 1 + for i in range(1, (Total_page_number + 1)): + if (page_navigation_link > 4): + page_navigation_link = 4 + time.sleep(2) + self.driver.find_element_by_xpath("(//*[@id='pagination-builtpackagestable']/ul//li//a[contains(@href,page)])[%d]" % page_navigation_link).click() + time.sleep(2) + packages_row_count = packages_row_count + len( + self.driver.find_elements_by_xpath("//*[@id='builtpackagestable']/tbody/tr")) + page_navigation_link = page_navigation_link + 1 + if int(packages_num) >= int(packages_row_count): + pass + else: + self.assertFalse(True, msg=("Error! The packages number is not correct")) + edit_Show_Rows = Select( + self.driver.find_element_by_xpath("(//select[@class='form-control pagesize-builtpackagestable'])[1]")) + selected_number_rows = "25" + edit_Show_Rows.select_by_value(selected_number_rows) + time.sleep(5) + row_count = len(self.driver.find_elements_by_xpath("//*[@id='builtpackagestable']/tbody/tr")) + for count in range(1, row_count + 1): + if ((self.driver.find_element_by_xpath( + "//*[@id='builtpackagestable']//tbody//tr[%d]//td[2]" % count).text) == ''): + self.assertFalse(True, msg=("Error! Version is not present for corresponding package")) + else: + pass + + if ((self.driver.find_element_by_xpath( + "//*[@id='builtpackagestable']//tbody//tr[%d]//td[3]" % count).text) == ''): + self.assertFalse(True, msg=("Error! Size is not present for corresponding package")) + else: + pass + + package_link = self.driver.find_element_by_xpath( + "//*[@id='builtpackagestable']/tbody/tr[%d]/td[1]/a" % count) + action = ActionChains(self.driver) + action.move_to_element(package_link).perform() + url = package_link.get_attribute("href") + self.assertTrue(url, msg=("url not found for corresponding packages")) + + def test_915(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + searched_key = 'hfidf' + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Configuration').click() + self.driver.find_element_by_link_text("BitBake variables").click() + self.driver.find_element_by_xpath("//*[@placeholder='Search BitBake variables']") + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_id("search").send_keys(searched_key) + self.driver.find_element_by_id("search-button").click() + if ( + self.driver.find_element_by_xpath("//div[@class='page-header build-data']").text.find(" No variables found")): + self.driver.find_element_by_xpath("//*[@value='" + searched_key + "']") + self.driver.find_element_by_xpath("//*[@id='searchform']/button[2]").click() + time.sleep(5) + elif (self.driver.find_element_by_xpath("//div[@class='page-header build-data']").text.find("variables found")): + self.driver.find_element_by_id("search").click() + self.driver.find_element_by_xpath("//*[@id='searchform']/div/div/a/span").click() + else: + self.assertFalse(True, msg=("Error:Searched text not found in ex[ected output")) + head_list = self.get_table_head_text('otable') + self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \ + msg=("head row contents wrong")) + head_list_sort = self.get_table_head_text('otable') + self.find_element_by_link_text_in_table('otable', 'Variable').click() + sort_list = self.get_table_column_text_by_column_number('otable', 1) + self.assertTrue(Utility.is_list_inverted(sort_list), msg=("list not inverted")) + + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_id("search").send_keys("poky") + self.driver.find_element_by_id("search-button").click() + head_list = self.get_table_head_text('otable') + self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \ + msg=("head row contents wrong")) + head_list = self.get_table_head_text('otable') + self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \ + msg=("head row contents wrong")) + sort_list = self.get_table_column_text_by_column_number('otable', 1) + self.assertTrue(Utility.is_list_inverted(sort_list), msg=("list not in order")) + time.sleep(2) + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_xpath("//*[@id='searchform']/div/div/a/span").click() + self.driver.find_element_by_xpath("(//span[@class='glyphicon glyphicon-filter filtered'])[1]").click() + time.sleep(10) + self.driver.find_element_by_xpath("(//input[@type='radio'])[2]").click() + self.driver.find_element_by_xpath("(//button[@type='submit'])[2]").click() + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_id("search").send_keys("poky") + self.driver.find_element_by_id("search-button").click() + self.driver.find_element_by_xpath("(//span[@class='glyphicon glyphicon-filter filtered'])[1]").click() + radio_button = self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[2]/div[1]/label/input") + time.sleep(3) + if (radio_button.is_selected()): + pass + else: + self.assertFalse(True, msg=("Error: Filter not got cleared after search")) + + def test_916(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.driver.find_element_by_link_text('Configuration').click() + self.driver.find_element_by_link_text("BitBake variables").click() + variable_list = self.get_table_column_text('class', 'variable_name') + self.assertTrue(Utility.is_list_sequenced(variable_list), msg=("list not in order")) + self.find_element_by_link_text_in_table('otable', 'Variable').click() + variable_list = self.get_table_column_text('class', 'variable_name') + self.assertTrue(Utility.is_list_inverted(variable_list), msg=("list not inverted")) + self.find_element_by_link_text_in_table('otable', 'Variable').click() + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_id("search").send_keys("lib") + self.driver.find_element_by_id("search-button").click() + variable_list = self.get_table_column_text('class', 'variable_name') + self.assertTrue(Utility.is_list_sequenced(variable_list), msg=("list not in order")) + + def test_923(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_xpath("//*[@id='global-nav']/ul/li[1]/a").click() + page_header = self.driver.find_elements_by_xpath("//div[@class='page-header']") + if (len(page_header) == 2): + if (self.driver.find_element_by_xpath("(//div[@class='page-header'])[1]").text == 'Latest builds'): + print("Latest builds string is present ") + elif (self.driver.find_element_by_xpath("(//div[@class='page-header'])[2]").text == 'All builds'): + print("All builds string is present") + else: + if (self.driver.find_element_by_xpath("(//div[@class='page-header'])[1]").text == 'All builds'): + print("All builds string is only present") + time.sleep(3) + c_list = self.get_table_column_text('class', 'completed_on') + self.assertTrue(Utility.is_list_inverted(c_list), msg=("list not inverted")) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + self.driver.find_element_by_id("checkbox-started_on").click() + time.sleep(3) + self.driver.find_element_by_id("checkbox-time").click() + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + self.log.info( + "Checking column headings : outcome, recipe, machine, started on, completed on, failed tasks, errors, warnings, time, image files, project from Table") + head_list = self.get_table_head_text('table-container-allbuildstable') + for item in ['Outcome', 'Recipe', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', + 'Time', "Image files", "Project"]: + self.failUnless(item in head_list, msg=item + ' is missing from table head.') + self.log.info("All column heading are there") + + def test_924(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get( + "http://localhost:8000/toastergui/builds/?limit=25&page=1&orderby=-completed_on&default_orderby=-completed_on&") + c_list = self.get_table_column_text('class', 'completed_on') + self.assertTrue(Utility.is_list_inverted(c_list), msg=("list not inverted")) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-errors_no").click() + head_list1 = self.get_table_head_text('allbuildstable') + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(1) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-errors_no").click() + head_list2 = self.get_table_head_text('allbuildstable') + self.driver.find_element_by_id("edit-columns-button").click() + self.assertTrue(len(head_list2) != len(head_list1), msg=("Error: head order is not correct")) + + def test_940(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Packages').click() + check_head_list = [u'Package', u'Package Version', u'Approx Size', ] + head_list = self.get_table_head_text('builtpackagestable') + self.assertTrue(head_list == check_head_list, msg=("head row not as expected")) + time.sleep(3) + option_ids = ['checkbox-recipe__layer_version__layer__name', 'checkbox-recipe__layer_version__branch', \ + 'checkbox-vcs_ref', 'checkbox-license', 'checkbox-recipe__name', 'checkbox-recipe__version'] + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + for item in option_ids: + if not self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + Minimum_Table_len = len(self.driver.find_elements_by_xpath("//label[@class='text-muted']")) + elements = self.driver.find_elements_by_xpath("//label[@class='text-muted']") + Minimum_Table_len = len(elements) + if (int(Minimum_Table_len) == 2): + for item in elements: + self.driver.find_element_by_id("edit-columns-button").click() + if (item.text == 'Package' or item.text == 'Package Version'): + pass + else: + self.assertTrue(item.text, msg=("Fail :Incorrect muted column")) + + self.driver.find_element_by_id("edit-columns-button").click() + + def test_941(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Packages').click() + column_list = self.get_table_column_text_by_column_number('builtpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + self.find_element_by_link_text_in_table('builtpackagestable', 'Approx Size').click() + time.sleep(3) + self.driver.find_element_by_xpath('//*[@id="builtpackagestable"]/tbody/tr[1]/td[1]/a').click() + time.sleep(3) + self.driver.back() + time.sleep(3) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + + option_ids = ['checkbox-recipe__layer_version__layer__name', 'checkbox-recipe__layer_version__branch', \ + 'checkbox-vcs_ref', 'checkbox-license', 'checkbox-recipe__name', 'checkbox-recipe__version'] + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + for item in option_ids: + if not self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + column_head = ['Package', 'Approx Size', 'License', 'Recipe', 'Layer', 'Layer branch'] + column_number = 1 + for item in column_head: + self.find_element_by_link_text_in_table('builtpackagestable', item).click() + time.sleep(3) + self.find_elements_by_link_text_in_table('builtpackagestable', item) + if (column_number == 2 or column_number == 6): + column_number = column_number + 1 + column_list_packages = self.get_table_column_text_by_column_number('builtpackagestable', column_number) + self.assertTrue(Utility.is_list_sequenced(column_list_packages) or Utility.is_list_inverted(column_list_packages), + msg=("list not in order")) + column_number = column_number + 1 + + self.driver.find_element_by_id("edit-columns-button").click() + for item in option_ids: + if self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + column_list = self.get_table_column_text_by_column_number('builtpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list) or Utility.is_list_inverted(column_list), msg=("list not in order")) + + self.find_element_by_link_text_in_table('builtpackagestable', 'Approx Size').click() + self.driver.find_element_by_id("search-input-builtpackagestable").clear() + time.sleep(3) + self.driver.find_element_by_id("search-input-builtpackagestable").send_keys('lib') + time.sleep(3) + self.driver.find_element_by_id("search-submit-builtpackagestable").click() + time.sleep(3) + column_list = self.get_table_column_text_by_column_number('builtpackagestable', 3) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + self.driver.find_element_by_id("search-input-builtpackagestable").clear() + time.sleep(3) + self.find_element_by_link_text_in_table('nav', 'core-image-minimal').click() + column_list = self.get_table_column_text_by_column_number('installedpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + self.find_element_by_link_text_in_table('installedpackagestable', 'Approx Size').click() + time.sleep(3) + self.driver.find_element_by_xpath("//*[@id='installedpackagestable']/tbody/tr[1]/td[1]/a").click() + time.sleep(3) + self.driver.back() + column_list = self.get_table_column_text_by_column_number('installedpackagestable', 3) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + + option_ids1 = ['checkbox-size', 'checkbox-license', 'checkbox-dependencies', 'checkbox-reverse_dependencies', + 'checkbox-recipe__name', \ + 'checkbox-recipe__version', 'checkbox-recipe__layer_version__layer__name', + 'checkbox-recipe__layer_version__branch', 'checkbox-vcs_ref', 'checkbox-installed_size'] + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + for item in option_ids1: + if not self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + column_head = ['Package', 'Approx Size', 'License', 'Recipe', 'Layer', 'Layer branch', 'Installed size'] + column_number = 1 + for item in column_head: + if ( + column_number == 2 or column_number == 5 or column_number == 6 or column_number == 8 or column_number == 11): + column_number = column_number + 1 + self.find_element_by_link_text_in_table('installedpackagestable', item).click() + time.sleep(3) + self.find_elements_by_link_text_in_table('installedpackagestable', item) + if ( + column_number == 2 or column_number == 5 or column_number == 6 or column_number == 8 or column_number == 11): + column_list_packages = self.get_table_column_text_by_column_number('installedpackagestable', + column_number) + self.assertTrue(Utility.is_list_sequenced(column_list_packages) or Utility.is_list_inverted(column_list_packages), + msg=("list not in order")) + column_number = column_number + 1 + + self.driver.find_element_by_id("edit-columns-button").click() + for item in option_ids1: + if self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + column_list = self.get_table_column_text_by_column_number('installedpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list) or Utility.is_list_inverted(column_list), msg=("list not in order")) + + self.find_element_by_link_text_in_table('installedpackagestable', 'Package').click() + self.driver.find_element_by_id("search-input-installedpackagestable").clear() + time.sleep(3) + self.driver.find_element_by_id("search-input-installedpackagestable").send_keys('lib') + time.sleep(3) + self.driver.find_element_by_id("search-submit-installedpackagestable").click() + time.sleep(3) + column_list = self.get_table_column_text_by_column_number('installedpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list) or Utility.is_list_inverted(column_list), msg=("list not in order")) + self.driver.find_element_by_id("search-input-installedpackagestable").clear() + time.sleep(3) + + def test_942(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.driver.find_element_by_link_text("Packages").click() + default_column_list = self.get_table_column_text_by_column_number('builtpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(default_column_list), msg=("list not in sequence for default pacakge column")) + head_list = self.get_table_head_text('builtpackagestable') + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-recipe__name").click() + self.driver.find_element_by_id("edit-columns-button").click() + new_head = self.get_table_head_text('builtpackagestable') + self.assertTrue(new_head > head_list) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-recipe__name").click() + self.driver.find_element_by_id("edit-columns-button").click() + new_head1 = self.get_table_head_text('builtpackagestable') + self.assertTrue(new_head1 < new_head) + + def test_943(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + times = 2 + for i in range(0, times): + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Packages').click() + column_list = self.get_table_column_text_by_column_number('builtpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + head_list_before_seearch = self.get_table_head_text('builtpackagestable') + self.assertTrue(self.driver.find_element_by_xpath( + "//input[@id='search-input-builtpackagestable' and @placeholder='Search packages built']"), + msg=("plceholder string not present")) + self.driver.find_element_by_id("search-input-builtpackagestable").clear() + self.driver.find_element_by_id("search-input-builtpackagestable").click() + self.driver.find_element_by_id("search-input-builtpackagestable").send_keys("bash") + self.driver.find_element_by_id("search-submit-builtpackagestable").click() + if (int(self.driver.find_element_by_xpath( + "//div[@class='page-header build-data']/h1/span[@class='table-count-builtpackagestable']").text )== 0): + print("Pass:No packages found") + time.sleep(5) + self.driver.find_element_by_xpath("(//span[contains(@class,'remove-search-btn')])[1]").click() + time.sleep(2) + else: + print("Pass:packages found") + self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text")) + column_list = self.get_table_column_text_by_column_number('builtpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + new_head_after_search = self.get_table_head_text('builtpackagestable') + self.assertTrue(new_head_after_search == head_list_before_seearch) + self.driver.find_element_by_id("search-input-builtpackagestable").click() + self.driver.find_element_by_xpath("(//span[contains(@class,'remove-search-btn')])[2]").click() + time.sleep(5) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + self.driver.find_element_by_id("checkbox-size").click() + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("search-input-builtpackagestable").clear() + self.driver.find_element_by_id("search-input-builtpackagestable").send_keys("GPL") + self.driver.find_element_by_id("search-submit-builtpackagestable").click() + self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text")) + + self.find_element_by_link_text_in_table('nav', 'core-image-minimal').click() + column_list = self.get_table_column_text_by_column_number('installedpackagestable', 1) + self.assertTrue(Utility.is_list_sequenced(column_list), msg=("list not in order")) + self.assertTrue(self.driver.find_element_by_xpath( + "//input[@id='search-input-installedpackagestable' and @placeholder='Search packages included']"), + msg=("plceholder string not present")) + self.driver.find_element_by_id("search-input-installedpackagestable").clear() + self.driver.find_element_by_id("search-input-installedpackagestable").send_keys("lib") + self.driver.find_element_by_id("search-submit-installedpackagestable").click() + self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text")) + self.driver.find_element_by_id("search-input-installedpackagestable").clear() + self.driver.find_element_by_id("search-input-installedpackagestable").send_keys("GPL") + self.driver.find_element_by_id("search-submit-installedpackagestable").click() + self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text")) + + def test_944(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Recipes').click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + self.driver.find_element_by_id("checkbox-layer_version__branch").click() + self.driver.find_element_by_id("checkbox-commit").click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + otable_head_text = self.get_table_head_text('builtrecipestable') + for item in ["Layer", "Layer branch", "Layer commit"]: + self.failIf(item not in otable_head_text, msg=item + ' not in table head.') + self.get_table_element("builtrecipestable", 1, 1).click() + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"]), \ + msg=("text not in web page")) + if(self.get_table_column_text_by_column_number('builtrecipestable',9) == ''): + print("Pass:Layer branch can be empty in recipie") + self.driver.back() + time.sleep(1) + self.find_element_by_link_text_in_table('nav', 'Packages').click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-recipe__layer_version__layer__name").click() + self.driver.find_element_by_id("checkbox-recipe__layer_version__branch").click() + self.driver.find_element_by_id("checkbox-vcs_ref").click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + otable_head_text = self.get_table_head_text("builtpackagestable") + for item in ["Layer", "Layer branch", "Layer commit"]: + self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item)) + self.get_table_element("builtpackagestable", 1, 1).click() + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ + msg=("text not in web page")) + if (self.get_table_column_text_by_column_number('builtpackagestable', 8) == ''): + print("Pass:Layer branch can be empty in recipie") + self.driver.back() + time.sleep(3) + self.find_element_by_link_text_in_table('nav', 'core-image-minimal').click() + time.sleep(2) + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(2) + self.driver.find_element_by_id("checkbox-recipe__layer_version__layer__name").click() + self.driver.find_element_by_id("checkbox-recipe__layer_version__branch").click() + self.driver.find_element_by_id("checkbox-vcs_ref").click() + self.driver.find_element_by_id("edit-columns-button").click() + otable_head_text = self.get_table_head_text("installedpackagestable") + for item in ["Layer", "Layer branch", "Layer commit"]: + self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item)) + time.sleep(3) + self.get_table_element("installedpackagestable", 1, 1).click() + time.sleep(3) + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ + msg=("text not in web page")) + self.driver.back() + self.driver.find_element_by_link_text("Configuration").click() + otable_head_text = self.get_table_head_text() + self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ + msg=("text not in web page")) + time.sleep(3) + self.driver.back() + time.sleep(3) + self.assertTrue(self.is_text_present("Layers"), msg=("text not in web page")) + + def test_945(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + time.sleep(3) + for item in ["Packages", "Recipes", "Tasks"]: + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.driver.find_element_by_link_text(item).click() + if (item == "Packages"): + item_id = 'builtpackagestable' + self.driver.find_element_by_xpath("//*[@id='" + item_id + "']/tbody/tr[1]/td[1]/a").click() + elif (item == "Recipes"): + item_id = 'builtrecipestable' + self.driver.find_element_by_xpath("//*[@id='" + item_id + "']/tbody/tr[1]/td[1]/a").click() + elif (item == "Tasks"): + item_id = 'buildtaskstable' + self.driver.find_element_by_xpath("//*[@id='" + item_id + "']/tbody/tr[1]/td[2]/a").click() + time.sleep(3) + self.driver.find_element_by_xpath("//*[@id='breadcrumb']/li[4]/a").click() + time.sleep(3) + edit_Show_Rows = Select(self.driver.find_element_by_xpath( + "//*[@id='table-chrome-collapse-" + item_id + "']/form[2]/div/select ")) + selected_number_rows = ['10', '25', '50', '100', '150'] + for item in selected_number_rows: + edit_Show_Rows.select_by_value(item) + self.assertTrue(edit_Show_Rows, msg="rows displayed is not as per selection") + time.sleep(3) + + maxium_page_number = len(self.driver.find_elements_by_xpath("//*[@class='pagination']/li")) + if (maxium_page_number < 5 or maxium_page_number == 5): + pass + else: + print("Error: Maximum number of pages navigation button is not correct") + for i in range(2, maxium_page_number + 1): + self.driver.find_element_by_xpath("(//*[@class='pagination']/li/a[@href='#'])[%d]" % i).click() + self.driver.find_element_by_xpath("(//*[@class='pagination']/li/a[@href='#'])[%d]" % (i - 1)).click() + time.sleep(5) + + def test_946(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.driver.find_element_by_link_text("Configuration").click() + check_list = ["Summary", "BitBake variables"] + for item in check_list: + if not self.is_element_present(how=By.LINK_TEXT, what=item): + self.log.error("%s not found" % item) + if not self.is_text_present(['Layers', 'Layer', 'Layer branch', 'Layer commit']): + self.log.error("text not found") + self.driver.find_element_by_link_text("BitBake variables").click() + if not self.is_text_present(['Variable', 'Value', 'Set in file', 'Description']): + self.log.error("text not found") + temp_element = self.find_element_by_text_in_table('otable', "Set in file") + temp_element.find_element_by_xpath( + r"//div[@class='btn-group pull-right']/a[@class='btn btn-xs ']/span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(1) + self.driver.find_element_by_xpath("(//input[@name='filter'])[2]").click() + btns = self.driver.find_elements_by_css_selector("button.btn.btn-primary") + for btn in btns: + try: + btn.click() + break + except: + pass + time.sleep(1) + self.save_screenshot(screenshot_type='selenium', append_name='step6') + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(1) + self.save_screenshot(screenshot_type='selenium', append_name='step7') + self.driver.find_element_by_id("edit-columns-button").click() + elements = self.driver.find_elements_by_xpath("//*[@id='editcol']/li/div/label[@class='muted']") + if (len(elements) == 2): + pass + else: + print("Error ! Total default muted column is not correct") + self.driver.find_element_by_xpath("//*[@id='otable']/tbody/tr[1]/td[1]/a").click() + time.sleep(1) + element = self.driver.switch_to.active_element + check_list = ['Order', 'Configuration file', 'Operation'] + for item in check_list: + if item not in element.text: + self.log.error("%s not found" % item) + element.find_element_by_class_name("close").click() + time.sleep(3) + self.driver.find_element_by_xpath("//a[contains(@href,'yoctoproject.org')]").click() + time.sleep(3) + self.save_screenshot(screenshot_type='native', append_name='step10') + + def test_947(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Configuration').click() + self.driver.find_element_by_link_text("BitBake variables").click() + + def xpath_option(column_name): + return self.shortest_xpath('id', 'navTab') + self.shortest_xpath('id', 'editcol') \ + + self.shortest_xpath('id', column_name) + + self.driver.find_element_by_id('edit-columns-button').click() + self.driver.find_element_by_xpath(xpath_option('description')).click() + self.driver.find_element_by_xpath(xpath_option('file')).click() + self.driver.find_element_by_id('edit-columns-button').click() + check_list = ['Description', 'Set in file'] + head_list = self.get_table_head_text('otable') + for item in check_list: + self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item)) + self.driver.find_element_by_id('edit-columns-button').click() + self.driver.find_element_by_xpath(xpath_option('description')).click() + self.driver.find_element_by_xpath(xpath_option('file')).click() + self.driver.find_element_by_id('edit-columns-button').click() + head_list = self.get_table_head_text('otable') + for item in check_list: + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) + + def test_948(self): + Comparable_string = "You can only apply one filter to the table. This filter will override the current filter." + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'Configuration').click() + self.driver.find_element_by_link_text("BitBake variables").click() + self.driver.find_element_by_xpath( + "//th[@class='span4 description']//span[@class='glyphicon glyphicon-filter filtered']") + self.driver.find_element_by_xpath("//th[@class=' file']//span[@class='glyphicon glyphicon-filter filtered']") + self.driver.find_element_by_xpath( + "//th[@class=' file']//span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(5) + self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[2]/div[3]/label/input").click() + time.sleep(3) + self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[3]/div/div[1]/button").click() + time.sleep(5) + self.driver.find_element_by_xpath( + "//th[@class='span4 description']//span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(3) + if (Comparable_string == self.driver.find_element_by_xpath( + "//*[@id='filter_description']/div/div/form/div[3]/div/div[2]/p").text): + pass + else: + print("Error: string not found") + self.driver.find_element_by_xpath("//*[@id='filter_description']/div/div/form/div[1]/button").click() + time.sleep(5) + + self.driver.find_element_by_xpath( + "//th[@class=' file']//span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(5) + self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[2]/div[3]/label/input").click() + time.sleep(3) + self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[3]/div/div[1]/button").click() + time.sleep(5) + self.driver.find_element_by_id("search").clear() + time.sleep(5) + self.driver.find_element_by_id("search").send_keys("BB") + time.sleep(5) + self.driver.find_element_by_id("search-button").click() + time.sleep(5) + self.driver.find_element_by_xpath( + "//th[@class=' file']//span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(5) + radio_button_selected = self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[2]/div[1]/label/input") + if (radio_button_selected.is_selected()): + pass + else: + print("Fail:Filter not cleared after search") + self.driver.find_element_by_xpath("//*[@id='filter_vhistory__file_name']/div/div/form/div[1]/button").click() + time.sleep(5) + self.driver.find_element_by_xpath("//*[@id='searchform']/div/div/a/span").click() + time.sleep(5) + self.driver.find_element_by_id("search").clear() + time.sleep(20) + self.driver.find_element_by_id("search").send_keys("busybox") + time.sleep(20) + self.driver.find_element_by_id("search-button").click() + time.sleep(30) + self.driver.find_element_by_xpath( + "//th[@class=' file']//span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(5) + self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[2]/div[5]/label/input").click() + time.sleep(3) + self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[3]/div/div[1]/button").click() + time.sleep(10) + self.driver.find_element_by_xpath( + "//th[@class=' file']//span[@class='glyphicon glyphicon-filter filtered']").click() + time.sleep(5) + radio_button_selected = self.driver.find_element_by_xpath( + "//*[@id='filter_vhistory__file_name']/div/div/form/div[2]/div[5]/label/input") + if (radio_button_selected.is_selected()): + pass + else: + print("Fail:Filter not cleared") + self.driver.find_element_by_xpath("//*[@id='filter_vhistory__file_name']/div/div/form/div[1]/button") + + def test_949(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.find_element_by_link_text_in_table('nav', 'core-image-minimal').click() + try: + self.driver.find_element_by_partial_link_text("Packages included") + self.driver.find_element_by_partial_link_text("Directory structure") + except Exception as e: + self.log.error(e) + self.assertFalse(True) + + package_included = (self.driver.find_element_by_xpath("//*[@id='navTab']/ul/li[1]/a").text) + self.assertTrue(self.is_text_present(package_included), + msg=("total number of packages and total size not found in Package included")) + head_list = self.get_table_head_text('installedpackagestable') + for item in ['Package', 'Package Version']: + self.assertTrue(item in head_list, msg=("item %s not in head row" % item)) + self.driver.find_element_by_id("edit-columns-button").click() + default_list = self.driver.find_elements_by_xpath("// *[@checked ='checked']") + if (len(default_list) == 4): + pass + else: + print("Fail: Deafault column numbernot correct") + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_partial_link_text("Packages included").click() + option_ids = ['checkbox-size', 'checkbox-license', 'checkbox-dependencies', 'checkbox-reverse_dependencies', + 'checkbox-recipe__name', 'checkbox-recipe__version', \ + 'checkbox-recipe__layer_version__layer__name', 'checkbox-recipe__layer_version__branch', + 'checkbox-vcs_ref', 'checkbox-vcs_ref'] + self.driver.find_element_by_id("edit-columns-button").click() + time.sleep(3) + for item in option_ids: + if not self.driver.find_element_by_id(item).is_selected(): + self.driver.find_element_by_id(item).click() + time.sleep(3) + self.driver.find_element_by_id("edit-columns-button").click() + + self.driver.find_element_by_partial_link_text("Directory structure").click() + head_list = self.get_table_head_text('dirtable') + for item in ['Directory / File', 'Symbolic link to', 'Source package', 'Size', 'Permissions', 'Owner', 'Group']: + self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item)) + self.get_table_element("dirtable", 1, 1).click() + self.assertTrue(self.is_text_present( + ["Directory / File", "Symbolic link to", "Source package", "Size", "Permissions", "Owner", "Group"]), \ + msg=("text not in web page")) + + def test_950(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + check_list = ['Configuration', 'Tasks', 'Recipes', 'Packages', 'Time', 'CPU usage', 'Disk I/O'] + has_successful_build = 1 + has_failed_build = 1 + try: + pass_icon = self.driver.find_element_by_xpath("//*[@class='icon-ok-sign success']") + except Exception: + self.log.info("checking for successful build") + has_successful_build = 0 + pass + if has_successful_build: + pass_icon.click() + time.sleep(1) + self.save_screenshot(screenshot_type='selenium', append_name='step3_1') + for item in check_list: + try: + self.find_element_by_link_text_in_table('nav', item) + except Exception: + self.assertFalse(True, msg=("link %s cannot be found in the page" % item)) + check_list_2 = ['Packages included', 'Total package size', \ + 'License manifest', 'Image files'] + self.assertTrue(self.is_text_present(check_list_2), msg=("text not in web page")) + self.driver.back() + try: + fail_icon = self.driver.find_element_by_xpath("//*[@class='icon-minus-sign error']") + except Exception: + has_failed_build = 0 + self.log.info("checking if build exists") + pass + if has_failed_build: + fail_icon.click() + time.sleep(1) + self.save_screenshot(screenshot_type='selenium', append_name='step3_2') + for item in check_list: + try: + self.find_element_by_link_text_in_table('nav', item) + except Exception: + self.assertFalse(True, msg=("link %s cannot be found in the page" % item)) + check_list_3 = ['Machine', 'Distro', 'Layers', 'Total number of tasks', 'Tasks executed', \ + 'Tasks not executed', 'Reuse', 'Recipes built', 'Packages built'] + self.assertTrue(self.is_text_present(check_list_3), msg=("text not in web page")) + self.driver.back() + + def test_951(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + element_latest = self.driver.find_element_by_xpath("//*[@id='latest-builds']/div/div[2]/div[2]/div[3]/a") + str_warning_latest = element_latest.text + if (str_warning_latest.find("warnings") and str_warning_latest.split()[1] != ''): + pass + else: + print("Error :warnings are not present in latest build") + element_latest.click() + self.driver.back() + element_all_build = self.driver.find_element_by_xpath("//*[@id='allbuildstable']/tbody/tr/td[8]/a") + str_warning_all = element_all_build.text + if (str_warning_all.find("warnings") and str_warning_all.split()[1] != ''): + pass + else: + print("Error :warnings are not present in All build") + element_all_build.click() + self.driver.back() + has_successful_build = 1 + has_failed_build = 1 + try: + fail_icon = self.driver.find_element_by_xpath("//*[@class='icon-minus-sign error']") + except Exception: + has_failed_build = 0 + self.log.info("no failed build exists") + pass + if has_failed_build: + self.driver.find_element_by_partial_link_text("error").click() + self.driver.back() + time.sleep(1) + self.save_screenshot(screenshot_type='selenium', append_name='step4') + + def test_955(self): + self.case_no = self.get_case_number() + self.log.info(' CASE %s log: ' % str(self.case_no)) + self.driver.maximize_window() + self.driver.get(self.base_url) + self.driver.find_element_by_link_text("core-image-minimal").click() + self.driver.find_elements_by_xpath("//*[@id='breadcrumb']/li") + self.driver.find_elements_by_xpath("//*[@id='build-menu']/li") + self.assertFalse(self.driver.find_element_by_xpath( + "//div[@class='page-header build-data']").text != 'core-image-minimal qemux86', + msg="Build Image is not present") + + self.driver.find_element_by_xpath("//h2[@data-heading='build-artifacts']") + self.driver.find_element_by_xpath("//h2[@data-role='build-summary-heading']") + self.assertFalse(self.driver.find_element_by_xpath("(//span/strong)[3]").text != 'Completed', + msg="Completed is not present") + packages_link = self.driver.find_element_by_xpath( + "//div[@class='well well-transparent dashboard-section']/h3/a") + self.assertFalse(packages_link.get_attribute("href") == '', msg="Link not assocaited with pacakge") + self.assertFalse( + self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])/dt)[1]").text != 'Packages included') + package_included_link = self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])/dd)[1]/a") + self.assertFalse(package_included_link.get_attribute("href") == '', msg="Link not assocaited with pacakge") + self.assertFalse( + int(self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])/dd)[1]/a/span").text) == 0, + msg='Packages included number is zero') + self.assertFalse( + self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])/dt)[2]").text != 'Total package size', + msg='Total package size string not present') + self.assertFalse((self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])/dd)[2]").text) == '', + msg='Total package size is zero') + self.assertFalse(self.driver.find_element_by_xpath("(//dl[@class='dl-horizontal'])[2]/dt").text != 'Manifests', + msg='Manifests string not present') + license_manifest_link = self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])[2]//dd)[1]/a") + self.assertFalse(license_manifest_link.get_attribute("href") == '', + msg="Link not assocaited with license_manifest") + package_manifest_link = self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])[2]//dd)[2]/a") + self.assertFalse(package_manifest_link.get_attribute("href") == '', + msg="Link not assocaited with package_manifest") + self.assertFalse( + self.driver.find_element_by_xpath("((//dl[@class='dl-horizontal'])[3]/dt)[1]").text != 'Image files', + msg='Image file text not present') + length = len(self.driver.find_elements_by_xpath("((//dl[@class='dl-horizontal'])[3]/dd)[1]//ul/li")) + for i in range(1, length + 1): + self.assertFalse(self.driver.find_element_by_xpath( + "(((//dl[@class='dl-horizontal'])[3]/dd)[1]//ul/li)[%d]" % i).text == '') + + Configuration_link = self.driver.find_element_by_xpath("(//div[@class='well well-transparent']/h3)[1]/a") + self.assertFalse(Configuration_link.text != 'Configuration', msg='Configuration text not present') + self.assertFalse(Configuration_link.get_attribute("href") == '', msg='Link not assocaites with configuration') + + self.driver.find_element_by_xpath( + "//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dt") + + self.assertFalse(self.driver.find_element_by_xpath( + "(//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dt)[1]").text != 'Machine', + msg='machine text not found') + self.assertFalse(self.driver.find_element_by_xpath( + "(//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dt)[2]").text != 'Distro', + msg='distro text not found') + self.assertFalse(self.driver.find_element_by_xpath( + "(//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dt)[3]").text != 'Layers', + msg='Layers text not found') + self.assertFalse(self.driver.find_element_by_xpath( + "(//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dd)[1]").text != 'qemux86', + msg='qemux86 text not found') + self.assertFalse(self.driver.find_element_by_xpath( + "(//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dd)[2]").text != 'poky', + msg='poky text not found') + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dd)[3]/ul/li)[1]").text != 'meta-poky', + msg='meta-poky text not found') + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dd)[3]/ul/li)[2]").text != 'meta-yocto-bsp', + msg='meta-yocto-bsp string not found') + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='col-md-4 dashboard-section']/div[@class='well well-transparent']/dl/dd)[3]/ul/li)[3]").text != 'openembedded-core', + msg='openembedded-core string not found') + + tasks_link = self.driver.find_element_by_xpath("(//div[@class='well well-transparent']/h3)[2]/a") + self.assertFalse(tasks_link.text != 'Tasks', msg="Task text not found") + self.assertFalse(tasks_link.get_attribute("href") == '', msg='Link not assocaites with tasks') + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent'])[2]/dl/dt)[1]").text != 'Total number of tasks', + msg='Text not available for tasks') + + No_tasks_link = self.driver.find_element_by_xpath("((//div[@class='well well-transparent'])[2]/dl/dd)[1]/a") + self.assertFalse(int(No_tasks_link.text) == 0, msg='No of toatl task is 0') + self.assertFalse(No_tasks_link.get_attribute("href") == '', + msg='Link not assocaited with total number of tasks') + + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent'])[2]/dl/dt)[2]").text != 'Tasks executed', + msg='Tasks executed text not found') + + Executed_tasks_link = self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent'])[2]/dl/dd)[2]/a") + self.assertFalse(int(Executed_tasks_link.text) == 0, msg='Total number of Tasks executed is zero') + self.assertFalse(Executed_tasks_link.get_attribute("href") == '', msg='Link not assocaited with Executed tasks') + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent'])[2]/dl/dt)[3]").text != 'Tasks not executed') + + Not_Executed_tasks_link = self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent'])[2]/dl/dd)[3]/a") + self.assertFalse(int(Not_Executed_tasks_link.text) == 0, msg='Total number of not executed tasks is zero') + self.assertFalse(Not_Executed_tasks_link.get_attribute("href") == '', + msg='Link not assocaited with not Executed tasks') + self.assertFalse( + self.driver.find_element_by_xpath("((//div[@class='well well-transparent'])[2]/dl/dt)[4]").text != 'Reuse', + msg='Reuse ttext not present') + + Reuse_tasks_link = self.driver.find_element_by_xpath("((//div[@class='well well-transparent'])[2]/dl/dd)[3]/a") + self.assertFalse(int(Reuse_tasks_link.text) == 0, msg='Resue tasks are showing zero') + + self.assertFalse( + (int(No_tasks_link.text) != (int(Executed_tasks_link.text) + int(Not_Executed_tasks_link.text))), + msg='Total Task calucaltion not correct') + Recipies_link = self.driver.find_element_by_xpath("((//div[@class='well well-transparent']/h3)[3]/a)[1]") + self.assertFalse(Recipies_link.text != 'Recipes', msg='Recipes text not found') + self.assertFalse(Recipies_link.get_attribute("href") == '', msg='Link not associated with Recipes section') + Packages_link = self.driver.find_element_by_xpath("((//div[@class='well well-transparent']/h3)[3]/a)[2]") + self.assertFalse(Packages_link.text != 'Packages', msg='Packages text not found') + self.assertFalse(Packages_link.get_attribute("href") == '', msg='Link not associated with packages section') + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent']/dl)[3]/dt)[1]").text != 'Recipes built', + msg='Recipie built text not found') + Recipie_built_link = self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent']/dl)[3]/dd)[1]/a") + self.assertFalse(int(Recipie_built_link.text) == 0, msg="Total packages number is showing zero") + self.assertFalse(Recipie_built_link.get_attribute("href") == '', + msg='Link not associated with built recipie section') + url_Recipie_built_link = Recipie_built_link.get_attribute("href") + self.assertFalse(self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent']/dl)[3]/dt)[2]").text != 'Packages built', + msg='Packages built text not found') + Package_built_link = self.driver.find_element_by_xpath( + "((//div[@class='well well-transparent']/dl)[3]/dd)[2]/a") + self.assertFalse(int(Package_built_link.text) == 0, msg="Total packages number is showing zero") + self.assertFalse(Package_built_link.get_attribute("href") == '', + msg='Link not associated with built packages section') diff --git a/toasteruitest/toaster_test.cfg b/toasteruitest/toaster_test.cfg new file mode 100644 index 00000000000..3792737e8c6 --- /dev/null +++ b/toasteruitest/toaster_test.cfg @@ -0,0 +1,10 @@ +# Configuration file for toaster_test +# Sorted by different host type +# test browser should be: chrome; firefox and IE(still under development) +# logging_level could be: CRITICAL; ERROR; WARNING; INFO; DEBUG; NOTSET + +[toaster_test_linux] +toaster_url = 'http://127.0.0.1:8000' +test_browser = 'chrome' +test_cases = [901,946,947,948,949,950,904,914,902,903,906,910,911,912,913,915,916,923,924,940,941,942,943,944,945,904] +logging_level = 'INFO' |