diff options
-rwxr-xr-x | toaster_automation_test.py | 542 |
1 files changed, 256 insertions, 286 deletions
diff --git a/toaster_automation_test.py b/toaster_automation_test.py index d8f838aeaff..3499cca55bf 100755 --- a/toaster_automation_test.py +++ b/toaster_automation_test.py @@ -547,6 +547,10 @@ class toaster_cases_base(unittest.TestCase): c_list.append(element.text) return c_list + def get_text_from_elements(self, css_selector): + elements = self.driver.find_elements_by_css_selector(css_selector) + return map(lambda x: x.text, elements) + def get_table_head_text(self, *table_id): #now table_id is a tuple... @@ -693,33 +697,41 @@ class toaster_cases(toaster_cases_base): self.driver.maximize_window() self.driver.get(self.base_url) # open all columns + time.sleep(5) self.driver.find_element_by_id("edit-columns-button").click() # adding explicitly wait for chromedriver..-_- self.browser_delay() - self.driver.find_element_by_id("started_on").click() + self.driver.find_element_by_id("checkbox-started_on").click() + self.browser_delay() + self.driver.find_element_by_id("checkbox-time").click() + self.browser_delay() + self.driver.find_element_by_id("checkbox-project").click() self.browser_delay() - self.driver.find_element_by_id("time").click() self.driver.find_element_by_id("edit-columns-button").click() # dict: {lint text name : actual class name} - table_head_dict = {'Outcome':'outcome', 'Recipe':'target', 'Machine':'machine', 'Started on':'started_on', 'Completed on':'completed_on', \ - 'Errors':'errors_no', 'Warnings':'warnings_no', 'Time':'time'} + table_head_dict = {'Outcome':'outcome', 'Machine':'machine', 'Started on':'started_on', 'Completed on':'completed_on', \ + 'Warnings':'warnings_no','Errors':'errors_no'} for key in table_head_dict: try: self.driver.find_element_by_link_text(key).click() + time.sleep(2) except Exception, e: self.log.error("%s cannot be found on page" % key) raise - column_list = self.get_table_column_text("class", table_head_dict[key]) + selector = "td[class='%s']" % table_head_dict[key] + column_list = self.get_text_from_elements(selector) # after 1st click, the list should be either sequenced or inverted, but we don't have a "default order" here # the point is, after another click, it should be another order if is_list_inverted(column_list): self.driver.find_element_by_link_text(key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + time.sleep(2) + column_list = self.get_text_from_elements(selector) self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key)) else: self.assertTrue(is_list_sequenced(column_list), msg=("%s column not sequenced" % key)) self.driver.find_element_by_link_text(key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + time.sleep(2) + column_list = self.get_text_from_elements(selector) self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key)) self.log.info("case passed") @@ -734,18 +746,22 @@ class toaster_cases(toaster_cases_base): self.driver.get(self.base_url) # Could add more test patterns here in the future. Also, could search some items other than target column in future.. patterns = ["minimal", "sato"] + for pattern in patterns: ori_target_column_texts = self.get_table_column_text("class", "target") - print ori_target_column_texts - self.driver.find_element_by_id("search").clear() - self.driver.find_element_by_id("search").send_keys(pattern) - self.driver.find_element_by_id("search-button").click() + 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") + print new_target_column_texts # if nothing found, we still count it as "pass" 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_css_selector("i.icon-remove").click() + time.sleep(2) + self.driver.find_element_by_id("search-input-allbuildstable").clear() + self.driver.find_element_by_id("search-submit-allbuildstable").click() target_column_texts = self.get_table_column_text("class", "target") self.assertTrue(ori_target_column_texts == target_column_texts, msg=("builds changed after operations")) @@ -762,41 +778,34 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("edit-columns-button").click() # currently all the delay are for chrome driver -_- self.browser_delay() - self.driver.find_element_by_id("started_on").click() + self.driver.find_element_by_id("checkbox-started_on").click() self.driver.find_element_by_id("edit-columns-button").click() # step 4 - items = ["Outcome", "Completed on", "Started on"] - for item in items: + filter_list = ['outcome_filter', 'started_on_filter', 'completed_on_filter','failed_tasks_filter'] + for key in filter_list: try: - temp_element = self.find_element_by_text_in_table('otable', item) - # this is how we find "filter icon" in the same level as temp_element(where "a" means clickable, "i" means icon) - self.assertTrue(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']")) + self.assertTrue(self.driver.find_element_by_id(key)) except Exception,e: - self.assertFalse(True, msg=(" %s cannot be found! %s" % (item, e))) + self.assertFalse(True, msg=(" %s cannot be found! %s" % (key, e))) raise + # step 5-6 - temp_element = self.find_element_by_link_text_in_table('otable', 'Outcome') - temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']").click() - self.browser_delay() - # the 2nd option, whatever it is - self.driver.find_element_by_xpath("(//input[@name='filter'])[2]").click() - # click "Apply" button - self.driver.find_element_by_xpath("//*[@id='filter_outcome']//*[text()='Apply']").click() - # save screen here - time.sleep(1) - self.save_screenshot(screenshot_type='selenium', append_name='step5') - temp_element = self.find_element_by_link_text_in_table('otable', 'Completed on') - temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']").click() - self.browser_delay() - self.driver.find_element_by_xpath("//*[@id='filter_completed_on']//*[text()='Apply']").click() - # save screen here to compare to previous one - # please note that for chrome driver, need a little break before saving - # screen here -_- - self.browser_delay() - self.save_screenshot(screenshot_type='selenium', append_name='step6') - self.driver.find_element_by_id("search").clear() - self.driver.find_element_by_id("search").send_keys("core-image") - self.driver.find_element_by_id("search-button").click() + for key in filter_list: + time.sleep(2) + self.driver.find_element_by_id(key).click() + time.sleep(2) + self.browser_delay() + + #click on radio-button 2 if is clickable + temp = self.driver.find_elements_by_class_name('radio') + temp[1].click() + # click "Apply" button + self.driver.find_element_by_css_selector('.btn.btn-primary').click() + self.save_screenshot(screenshot_type='selenium', append_name='step5-%s' %(key)) + + self.driver.find_element_by_id("search-input-allbuildstable").clear() + self.driver.find_element_by_id("search-input-allbuildstable").send_keys("core-image") + self.driver.find_element_by_id("search-submit-allbuildstable").click() ############## @@ -807,7 +816,7 @@ class toaster_cases(toaster_cases_base): 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("core-image").click() + self.driver.find_element_by_partial_link_text("core-image-minimal").click() self.driver.find_element_by_link_text("Tasks").click() self.table_name = 'otable' # This is how we find the "default" rows-number! @@ -819,7 +828,6 @@ class toaster_cases(toaster_cases_base): # Search text box background text is "Search tasks" self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search tasks']"),\ msg=("background text doesn't exist")) - self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys("busybox") self.driver.find_element_by_id("search-button").click() @@ -843,7 +851,9 @@ class toaster_cases(toaster_cases_base): # This is tricky here: we are doing so because there may be more than 1 # same-name link_text in one page. So we only find element inside the table self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + selector = "td[class='%s']" % table_head_dict[key] + column_list = self.get_text_from_elements(selector) + #column_list = self.get_table_column_text("class", table_head_dict[key]) # after 1st click, the list should be either sequenced or inverted, but we don't have a "default order" here # the point is, after another click, it should be another order # the first case is special:this means every item in column_list is the same, so @@ -851,17 +861,20 @@ class toaster_cases(toaster_cases_base): if (is_list_inverted(column_list) and is_list_sequenced(column_list)) \ or (not column_list) : self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + column_list = self.get_text_from_elements(selector) + #column_list = self.get_table_column_text("class", table_head_dict[key]) self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list), \ msg=("%s column not in any order" % key)) elif is_list_inverted(column_list): self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + column_list = self.get_text_from_elements(selector) + #column_list = self.get_table_column_text("class", table_head_dict[key]) self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key)) else: self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key)) self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + column_list = self.get_text_from_elements(selector) + #column_list = self.get_table_column_text("class", table_head_dict[key]) self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key)) # step 8-10 # filter dict: {link text name : filter table name in xpath} @@ -950,13 +963,18 @@ class toaster_cases(toaster_cases_base): 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() + print "1" # find "bash" in first column (Packages) + time.sleep(4) self.driver.find_element_by_xpath("//*[@id='otable']//td[1]//*[text()='bash']").click() + + print "2" # save sceen here to observe... # step 6 self.driver.find_element_by_partial_link_text("Generated files").click() head_list = self.get_table_head_text('otable') for item in ['File', 'Size']: + print item self.assertTrue(item in head_list, msg=("%s not in head row" % item)) c_list = self.get_table_column_text('class', 'path') self.assertTrue(is_list_sequenced(c_list), msg=("column not in order")) @@ -966,6 +984,7 @@ class toaster_cases(toaster_cases_base): # note that here table name is not 'otable' head_list = self.get_table_head_text('dependencies') for item in ['Package', 'Version', 'Size']: + print item 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(is_list_sequenced(c_list), msg=("list not in order")) @@ -995,7 +1014,6 @@ class toaster_cases(toaster_cases_base): print rows_displayed self.assertTrue(self.get_table_element(self.table_name, rows_displayed)) self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1)) - # Check the default table is sorted by Recipe tasks_column_count = len(self.driver.find_elements_by_xpath("/html/body/div[2]/div/div[2]/div[2]/table/tbody/tr/td[1]")) print tasks_column_count @@ -1003,10 +1021,8 @@ class toaster_cases(toaster_cases_base): #print default_column_list self.assertTrue(is_list_sequenced(default_column_list)) - # Search text box background text is "Search recipes" self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) - self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package1) self.driver.find_element_by_id("search-button").click() @@ -1014,14 +1030,12 @@ class toaster_cases(toaster_cases_base): self.save_screenshot(screenshot_type='selenium', append_name='step4') self.driver.find_element_by_css_selector("i.icon-remove").click() self.save_screenshot(screenshot_type='selenium', append_name='step4_2') - self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("depends_on").click() self.driver.find_element_by_id("layer_version__branch").click() self.driver.find_element_by_id("layer_version__layer__commit").click() self.driver.find_element_by_id("depends_by").click() self.driver.find_element_by_id("edit-columns-button").click() - self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click() # Check the inverted table by Recipe # Recipe doesn't have class name @@ -1035,16 +1049,22 @@ class toaster_cases(toaster_cases_base): #self.assertTrue(is_list_inverted(inverted_column_list)) #self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click() - table_head_dict = {'Recipe':'recipe__name', 'Recipe file':'recipe_file', 'Section':'recipe_section', \ + table_head_dict = {'Recipe':'recipe__name', 'Section':'recipe_section', \ 'License':'recipe_license', 'Layer':'layer_version__layer__name', \ 'Layer branch':'layer_version__branch'} + #'Recipe file':'recipe_file', for key in table_head_dict: self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + selector = "td[class='%s']" % table_head_dict[key] + column_list = self.get_text_from_elements(selector) + #column_list = self.get_table_column_text("class", table_head_dict[key]) + if (is_list_inverted(column_list) and is_list_sequenced(column_list)) \ or (not column_list) : self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + #column_list = self.get_table_column_text("class", table_head_dict[key]) + column_list = self.get_text_from_elements(selector) + self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list)) self.driver.find_element_by_partial_link_text("acl").click() self.driver.back() @@ -1054,12 +1074,17 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search-button").click() - column_search_list = self.get_table_column_text("class", table_head_dict[key]) + #column_search_list = self.get_table_column_text("class", table_head_dict[key]) + column_search_list = self.get_text_from_elements(selector) + self.assertTrue(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list)) self.driver.find_element_by_css_selector("i.icon-remove").click() elif is_list_inverted(column_list): self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + time.sleep(2) + #column_list = self.get_table_column_text("class", table_head_dict[key]) + column_list = self.get_text_from_elements(selector) + self.assertTrue(is_list_sequenced(column_list)) self.driver.find_element_by_partial_link_text("acl").click() self.driver.back() @@ -1069,36 +1094,53 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search-button").click() - column_search_list = self.get_table_column_text("class", table_head_dict[key]) + #column_search_list = self.get_table_column_text("class", table_head_dict[key]) + column_search_list = self.get_text_from_elements(selector) self.assertTrue(is_list_sequenced(column_search_list)) self.driver.find_element_by_css_selector("i.icon-remove").click() else: self.assertTrue(is_list_sequenced(column_list), msg=("list %s not sequenced" % key)) self.find_element_by_link_text_in_table(self.table_name, key).click() - column_list = self.get_table_column_text("class", table_head_dict[key]) + time.sleep(5) + #column_list = self.get_table_column_text("class", table_head_dict[key]) + column_list = self.get_text_from_elements(selector) + + time.sleep(5) + self.assertTrue(is_list_inverted(column_list)) + try: self.driver.find_element_by_partial_link_text("acl").click() + time.sleep(5) except: self.driver.find_element_by_partial_link_text("zlib").click() + time.sleep(5) self.driver.back() + self.assertTrue(is_list_inverted(column_list)) # Search text box background text is "Search recipes" self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']")) self.driver.find_element_by_id("search").clear() self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search-button").click() - column_search_list = self.get_table_column_text("class", table_head_dict[key]) - #print column_search_list + #column_search_list = self.get_table_column_text("class", table_head_dict[key]) + time.sleep(10) + column_search_list = self.get_text_from_elements(selector) self.assertTrue(is_list_inverted(column_search_list)) - self.driver.find_element_by_css_selector("i.icon-remove").click() - + #self.driver.find_element_by_css_selector("i.icon-remove").click() + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_id("search-button").click() + """ # Bug 5919 + print "bug" for key in table_head_dict: print key self.find_element_by_link_text_in_table(self.table_name, key).click() self.driver.find_element_by_id("edit-columns-button").click() - self.driver.find_element_by_id(table_head_dict[key]).click() + if key == 'Recipe': + print "pass" + else: + self.driver.find_element_by_id(table_head_dict[key]).click() self.driver.find_element_by_id("edit-columns-button").click() self.browser_delay() # After hide the column, the default table should be sorted by Recipe @@ -1114,7 +1156,7 @@ class toaster_cases(toaster_cases_base): self.driver.find_element_by_id("recipe_license").click() self.driver.find_element_by_id("layer_version__layer__name").click() self.driver.find_element_by_id("edit-columns-button").click() - + """ ############## # CASE 911 # @@ -1204,7 +1246,6 @@ class toaster_cases(toaster_cases_base): self.save_screenshot(screenshot_type='selenium', append_name='step4') self.driver.find_element_by_id("edit-columns-button").click() - ############## # CASE 914 # ############## @@ -1212,183 +1253,117 @@ class toaster_cases(toaster_cases_base): self.case_no = self.get_case_number() self.log.info(' CASE %s log: ' % str(self.case_no)) image_type="core-image-minimal" - test_package1="busybox" - test_package2="gdbm" - test_package3="gettext-native" + + dict_key_tasks = {'busybox':["do_fetch", "do_unpack", "do_patch", "do_configure", "do_compile", "do_install", "do_package", "do_build"] , \ + 'gdbm':["do_fetch", "do_unpack", "do_patch", "do_configure", "do_compile", "do_install", "do_package", "do_build"] ,\ + 'gettext-native':["do_fetch", "do_unpack", "do_patch", "do_configure", "do_compile", "do_install", "do_build"]} + driver = self.driver driver.maximize_window() driver.get(self.base_url) driver.find_element_by_link_text(image_type).click() - driver.find_element_by_link_text("Recipes").click() - driver.find_element_by_link_text(test_package1).click() - - self.table_name = 'information' + time.sleep(2) + for test_package in dict_key_tasks: + driver.find_element_by_link_text("Recipes").click() + time.sleep(2) + self.driver.find_element_by_id("search").clear() + self.driver.find_element_by_id("search").send_keys(test_package) + self.driver.find_element_by_id("search-button").click() + time.sleep(2) + driver.find_element_by_link_text(test_package).click() - tasks_row_count = len(driver.find_elements_by_xpath("//*[@id='"+self.table_name+"']/table/tbody/tr/td[1]")) - tasks_column_count = len(driver.find_elements_by_xpath("//*[@id='"+self.table_name+"']/table/tbody/tr[1]/td")) - print 'rows: '+str(tasks_row_count) - print 'columns: '+str(tasks_column_count) + self.table_name = 'information' - Tasks_column = self.get_table_column_text_by_column_number(self.table_name, 2) - print ("Tasks_column=", Tasks_column) + tasks_row_count = len(driver.find_elements_by_xpath("//*[@id='"+self.table_name+"']/table/tbody/tr/td[1]")) + tasks_column_count = len(driver.find_elements_by_xpath("//*[@id='"+self.table_name+"']/table/tbody/tr[1]/td")) + print 'rows: '+str(tasks_row_count) + print 'columns: '+str(tasks_column_count) - key_tasks=["do_fetch", "do_unpack", "do_patch", "do_configure", "do_compile", "do_install", "do_package", "do_build"] - i = 0 - while i < len(key_tasks): - if key_tasks[i] not in Tasks_column: - print ("Error! Missing key task: %s" % key_tasks[i]) - else: - print ("%s is in tasks" % key_tasks[i]) - i = i + 1 + Tasks_column = self.get_table_column_text_by_column_number(self.table_name, 2) + print ("Tasks_column=", Tasks_column) - if Tasks_column.index(key_tasks[0]) != 0: - print ("Error! %s is not in the right position" % key_tasks[0]) - else: - print ("%s is in right position" % key_tasks[0]) - - if Tasks_column[-1] != key_tasks[-1]: - print ("Error! %s is not in the right position" % key_tasks[-1]) - else: - print ("%s is in right position" % key_tasks[-1]) - driver.find_element_by_partial_link_text("Packages (").click() - packages_name = driver.find_element_by_partial_link_text("Packages (").text - print packages_name - packages_num = int(filter(str.isdigit, repr(packages_name))) - print packages_num - #switch the table to show more than 10 rows at a time - self.driver.find_element_by_xpath("//*[@id='packages-built']/div[1]/div/select").click() - Select(driver.find_element_by_xpath("//*[@id='packages-built']/div[1]/div/select")).select_by_value('150') - self.driver.find_element_by_xpath("//*[@id='packages-built']/div[1]/div/select").send_keys(Keys.ENTER) + #for key in dict_key_tasks: + key_tasks= dict_key_tasks[test_package] - packages_row_count = len(driver.find_elements_by_xpath("//*[@id='otable']/tbody/tr/td[1]")) - print packages_row_count + i = 0 + while i < len(key_tasks): + if key_tasks[i] not in Tasks_column: + print ("Error! Missing key task: %s" % key_tasks[i]) + else: + print ("%s is in tasks" % key_tasks[i]) + i = i + 1 - if packages_num != packages_row_count: - print ("Error! The packages number is not correct") - else: - print ("The packages number is correct") - - driver.find_element_by_partial_link_text("Build dependencies (").click() - depends_name = driver.find_element_by_partial_link_text("Build dependencies (").text - print depends_name - depends_num = int(filter(str.isdigit, repr(depends_name))) - print depends_num - - if depends_num == 0: - depends_message = repr(driver.find_element_by_css_selector("div.alert.alert-info").text) - print depends_message - if depends_message.find("has no build dependencies.") < 0: - print ("Error! The message isn't expected.") - else: - print ("The message is expected") - else: - depends_row_count = len(driver.find_elements_by_xpath("//*[@id='dependencies']/table/tbody/tr/td[1]")) - print depends_row_count - if depends_num != depends_row_count: - print ("Error! The dependent packages number is not correct") - else: - print ("The dependent packages number is correct") - - driver.find_element_by_partial_link_text("Reverse build dependencies (").click() - rdepends_name = driver.find_element_by_partial_link_text("Reverse build dependencies (").text - print rdepends_name - rdepends_num = int(filter(str.isdigit, repr(rdepends_name))) - print rdepends_num - - if rdepends_num == 0: - rdepends_message = repr(driver.find_element_by_css_selector("#brought-in-by > div.alert.alert-info").text) - print rdepends_message - if rdepends_message.find("has no reverse build dependencies.") < 0: - print ("Error! The message isn't expected.") + if Tasks_column.index(key_tasks[0]) != 0: + print ("Error! %s is not in the right position" % key_tasks[0]) else: - print ("The message is expected") - else: - print ("The reverse dependent packages number is correct") - - driver.find_element_by_link_text("Recipes").click() - driver.find_element_by_link_text(test_package2).click() - driver.find_element_by_partial_link_text("Packages (").click() - driver.find_element_by_partial_link_text("Build dependencies (").click() - driver.find_element_by_partial_link_text("Reverse build dependencies (").click() - - - driver.find_element_by_link_text("Recipes").click() - driver.find_element_by_link_text(test_package3).click() + print ("%s is in right position" % key_tasks[0]) - native_tasks_row_count = len(driver.find_elements_by_xpath("//*[@id='information']/table/tbody/tr/td[1]")) - native_tasks_column_count = len(driver.find_elements_by_xpath("//*[@id='information']/table/tbody/tr[1]/td")) - print native_tasks_row_count - print native_tasks_column_count - - Native_Tasks_column = self.get_table_column_text_by_column_number(self.table_name, 2) - print ("Native_Tasks_column=", Native_Tasks_column) - - native_key_tasks=["do_fetch", "do_unpack", "do_patch", "do_configure", "do_compile", "do_install", "do_build"] - i = 0 - while i < len(native_key_tasks): - if native_key_tasks[i] not in Native_Tasks_column: - print ("Error! Missing key task: %s" % native_key_tasks[i]) + if Tasks_column[-1] != key_tasks[-1]: + print ("Error! %s is not in the right position" % key_tasks[-1]) else: - print ("%s is in tasks" % native_key_tasks[i]) - i = i + 1 + print ("%s is in right position" % key_tasks[-1]) - if Native_Tasks_column.index(native_key_tasks[0]) != 0: - print ("Error! %s is not in the right position" % native_key_tasks[0]) - else: - print ("%s is in right position" % native_key_tasks[0]) + driver.find_element_by_partial_link_text("Packages (").click() + time.sleep(2) - if Native_Tasks_column[-1] != native_key_tasks[-1]: - print ("Error! %s is not in the right position" % native_key_tasks[-1]) - else: - print ("%s is in right position" % native_key_tasks[-1]) - driver.find_element_by_partial_link_text("Packages (").click() - native_packages_name = driver.find_element_by_partial_link_text("Packages (").text - print native_packages_name - native_packages_num = int(filter(str.isdigit, repr(native_packages_name))) - print native_packages_num - if native_packages_num != 0: - print ("Error! Native task shouldn't have any packages.") - else: - native_package_message = repr(driver.find_element_by_css_selector("#packages-built > div.alert.alert-info").text) - print native_package_message - if native_package_message.find("does not build any packages.") < 0: - print ("Error! The message for native task isn't expected.") - else: - print ("The message for native task is expected.") + packages_name = driver.find_element_by_partial_link_text("Packages (").text + print packages_name + packages_num = int(filter(str.isdigit, repr(packages_name))) + print packages_num - driver.find_element_by_partial_link_text("Build dependencies (").click() - native_depends_name = driver.find_element_by_partial_link_text("Build dependencies (").text - print native_depends_name - native_depends_num = int(filter(str.isdigit, repr(native_depends_name))) - print native_depends_num + if(packages_num !=0): + #switch the table to show more than 10 rows at a time + Select(driver.find_element_by_xpath(".//*[@id='packages-built']/div[1]/div/select")).select_by_value('150') - native_depends_row_count = len(driver.find_elements_by_xpath("//*[@id='dependencies']/table/tbody/tr/td[1]")) - print native_depends_row_count + packages_row_count = len(driver.find_elements_by_xpath(".//*[@id='otable']/tbody/tr/td[1]")) - if native_depends_num != native_depends_row_count: - print ("Error! The dependent packages number is not correct") - else: - print ("The dependent packages number is correct") + print packages_row_count - driver.find_element_by_partial_link_text("Reverse build dependencies (").click() - native_rdepends_name = driver.find_element_by_partial_link_text("Reverse build dependencies (").text - print native_rdepends_name - native_rdepends_num = int(filter(str.isdigit, repr(native_rdepends_name))) - print native_rdepends_num - - native_rdepends_row_count = len(driver.find_elements_by_xpath("//*[@id='brought-in-by']/table/tbody/tr/td[1]")) - print native_rdepends_row_count - - if native_rdepends_num != native_rdepends_row_count: - print ("Error! The reverse dependent packages number is not correct") - else: - print ("The reverse dependent packages number is correct") - - driver.find_element_by_link_text("Recipes").click() + if packages_num != packages_row_count: + print ("Error! The packages number is not correct") + else: + print ("The packages number is correct") + + driver.find_element_by_partial_link_text("Build dependencies (").click() + depends_name = driver.find_element_by_partial_link_text("Build dependencies (").text + print depends_name + depends_num = int(filter(str.isdigit, repr(depends_name))) + print depends_num + + if depends_num == 0: + depends_message = repr(driver.find_element_by_css_selector("div.alert.alert-info").text) + print depends_message + if depends_message.find("has no build dependencies.") < 0: + print ("Error! The message isn't expected.") + else: + print ("The message is expected") + else: + depends_row_count = len(driver.find_elements_by_xpath("//*[@id='dependencies']/table/tbody/tr/td[1]")) + print depends_row_count + if depends_num != depends_row_count: + print ("Error! The dependent packages number is not correct") + else: + print ("The dependent packages number is correct") + + driver.find_element_by_partial_link_text("Reverse build dependencies (").click() + rdepends_name = driver.find_element_by_partial_link_text("Reverse build dependencies (").text + print rdepends_name + rdepends_num = int(filter(str.isdigit, repr(rdepends_name))) + print rdepends_num + + if rdepends_num == 0: + rdepends_message = repr(driver.find_element_by_css_selector("#brought-in-by > div.alert.alert-info").text) + print rdepends_message + if rdepends_message.find("has no reverse build dependencies.") < 0: + print ("Error! The message isn't expected.") + else: + print ("The message is expected") + else: + print ("The reverse dependent packages number is correct") ############## @@ -1475,14 +1450,13 @@ class toaster_cases(toaster_cases_base): self.assertTrue(is_list_inverted(c_list), msg=("list not inverted")) # step 3 self.driver.find_element_by_id("edit-columns-button").click() - self.driver.find_element_by_id("started_on").click() - self.driver.find_element_by_id("time").click() + self.driver.find_element_by_id("checkbox-started_on").click() + self.driver.find_element_by_id("checkbox-time").click() self.driver.find_element_by_id("edit-columns-button").click() - head_list = self.get_table_head_text('otable') + head_list = self.get_table_head_text('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.') - ############## # CASE 924 # ############## @@ -1498,11 +1472,12 @@ class toaster_cases(toaster_cases_base): # Step 4 # click Errors , order in "Completed on" should be disturbed. Then hide # error column to check if order in "Completed on" can be restored -#THIS TEST IS NO LONGER VALID DUE TO DESIGN CHANGES. LEAVING IN PENDING UPDATES TO DESIGN - #self.find_element_by_link_text_in_table('otable', 'Errors').click() - #self.driver.find_element_by_id("edit-columns-button").click() - #self.driver.find_element_by_id("errors_no").click() - #self.driver.find_element_by_id("edit-columns-button").click() + #THIS TEST IS NO LONGER VALID DUE TO DESIGN CHANGES. LEAVING IN PENDING UPDATES TO DESIGN + self.find_element_by_link_text_in_table('allbuildstable', 'Errors').click() + self.driver.find_element_by_id("edit-columns-button").click() + self.driver.find_element_by_id("checkbox-errors_no").click() + self.driver.find_element_by_id("checkbox-failed_tasks").click() + self.driver.find_element_by_id("edit-columns-button").click() # Note: without time.sleep here, there'll be unpredictable error..TBD time.sleep(1) c_list = self.get_table_column_text('class', 'completed_on') @@ -1602,60 +1577,43 @@ class toaster_cases(toaster_cases_base): self.driver.maximize_window() self.driver.get(self.base_url) self.driver.find_element_by_link_text("core-image-minimal").click() - # step 1: test Recipes page stuff - self.driver.find_element_by_link_text("Recipes").click() - # for these 3 items, default status is not-checked - self.driver.find_element_by_id("edit-columns-button").click() - self.driver.find_element_by_id("layer_version__branch").click() - self.driver.find_element_by_id("layer_version__layer__commit").click() - self.driver.find_element_by_id("edit-columns-button").click() - # otable is the recipes table here - otable_head_text = self.get_table_head_text('otable') - for item in ["Layer", "Layer branch", "Layer commit"]: - self.failIf(item not in otable_head_text, msg=item+' not in table head.') - # click the fist recipe, whatever it is - self.get_table_element("otable", 1, 1).click() - self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"]), \ - msg=("text not in web page")) - # step 2: test Packages page stuff. almost same as above - self.driver.back() - self.browser_delay() - self.driver.find_element_by_link_text("Packages").click() - self.driver.find_element_by_id("edit-columns-button").click() - self.driver.find_element_by_id("recipe__layer_version__layer__name").click() - self.driver.find_element_by_id("recipe__layer_version__branch").click() - self.driver.find_element_by_id("recipe__layer_version__layer__commit").click() - self.driver.find_element_by_id("edit-columns-button").click() - otable_head_text = self.get_table_head_text("otable") - 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)) - # click the fist recipe, whatever it is - self.get_table_element("otable", 1, 1).click() - self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ - msg=("text not in web page")) - # step 3: test Packages core-image-minimal(images) stuff. almost same as above. Note when future element-id changes... - self.driver.back() - self.driver.find_element_by_link_text("core-image-minimal").click() - self.driver.find_element_by_id("edit-columns-button").click() - self.driver.find_element_by_id("layer_name").click() - self.driver.find_element_by_id("layer_branch").click() - self.driver.find_element_by_id("layer_commit").click() - self.driver.find_element_by_id("edit-columns-button").click() - otable_head_text = self.get_table_head_text("otable") - 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)) - # click the fist recipe, whatever it is - self.get_table_element("otable", 1, 1).click() - self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \ - msg=("text not in web page")) + dict_key_id = {'Recipes':["layer_version__branch", "layer_version__layer__commit"] , \ + 'Packages':["recipe__layer_version__layer__name", "recipe__layer_version__branch", "recipe__layer_version__layer__commit"] ,\ + 'core-image-minimal':["layer_name", "layer_branch", "layer_commit"]} + + layer_list = ["Layer", "Layer branch", "Layer commit"] + # step 1,2,3: test Recipes, Packages, core-image-minimal page stuff + for item in dict_key_id: + print item + self.driver.find_element_by_link_text(item).click() + # for these 3 items, default status is not-checked + self.driver.find_element_by_id("edit-columns-button").click() + for i in dict_key_id[item]: + self.driver.find_element_by_id(i).click() + self.driver.find_element_by_id("edit-columns-button").click() + # otable is the recipes table here + otable_head_text = self.get_table_head_text('otable') + for itm in layer_list: + self.failIf(itm not in otable_head_text, msg=itm+' not in table head.') + # click the fist recipe, whatever it is + self.get_table_element("otable", 1, 1).click() + if item == 'Recipes': + self.assertTrue(self.is_text_present(layer_list + ["Recipe file"]), \ + msg=("text not in web page")) + else: + self.assertTrue(self.is_text_present(layer_list), \ + msg=("text not in web page")) + + self.driver.back() + self.browser_delay() # step 4: check Configuration page - self.driver.back() + #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"]), \ + self.assertTrue(self.is_text_present(layer_list), \ msg=("text not in web page")) @@ -1666,33 +1624,44 @@ class toaster_cases(toaster_cases_base): self.case_no = self.get_case_number() self.log.info(' CASE %s log: ' % str(self.case_no)) self.driver.maximize_window() + #option_tobeselected = 3 for item in ["Packages", "Recipes", "Tasks"]: + print item self.driver.get(self.base_url) self.driver.find_element_by_link_text("core-image-minimal").click() - self.driver.find_element_by_link_text(items).click() + self.driver.find_element_by_link_text(item).click() # this may be page specific. If future page content changes, try to replace it with new xpath xpath_showrows = "/html/body/div[4]/div/div/div[2]/div[2]/div[2]/div/div/div[2]/select" xpath_table = "html/body/div[4]/div/div/div[2]/div[2]/table/tbody"#"id=('otable')/tbody" - self.driver.find_element_by_xpath(xpath_showrows).click() + time.sleep(5) + + #self.driver.find_element_by_xpath(xpath_showrows).click() + Select(self.driver.find_element_by_xpath(xpath_showrows)).select_by_value('50') + time.sleep(4) rows_displayed = int(self.driver.find_element_by_xpath(xpath_showrows + "/option[2]").text) + print 'rows=' + print rows_displayed # not sure if this is a Selenium Select bug: If page is not refreshed here, "select(by visible text)" operation will go back to 100-row page # Sure we can use driver.get(url) to refresh page, but since page will vary, we use click link text here - self.driver.find_element_by_link_text(items).click() + + self.driver.find_element_by_link_text(item).click() Select(self.driver.find_element_by_css_selector("select.pagesize")).select_by_visible_text(str(rows_displayed)) + self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) - self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) + #.//*[@id=str(rows_displayed)]/td[1]/a + self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) # click 1st package, then go back to check if it's still those rows shown. - self.driver.find_element_by_xpath(xpath_otable + "/tr[1]/td[1]/a").click() + self.driver.find_element_by_xpath(xpath_table + "/tr[1]/td[1]/a").click() time.sleep(3) self.driver.find_element_by_link_text(item).click() - self.assertTrue(self.is_element_present(By.XPATH, xpath_otable + "/tr[" + str(option_tobeselected) +"]"),\ - msg=("Row %d should exist" %option_tobeselected)) - self.assertFalse(self.is_element_present(By.XPATH, xpath_otable + "/tr[" + str(option_tobeselected+1) +"]"),\ - msg=("Row %d should not exist" %(option_tobeselected+1))) + self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"),\ + msg=("Row %d should exist" %rows_displayed)) + self.assertFalse(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"),\ + msg=("Row %d should not exist" %(rows_displayed+1))) ############## @@ -1752,6 +1721,7 @@ class toaster_cases(toaster_cases_base): # any better way to close this pop-up? ... TBD element.find_element_by_class_name("close").click() # step 10 : need to manually check "Yocto Manual" in saved screen + time.sleep(1) self.driver.find_element_by_css_selector("i.icon-share.get-info").click() # save screen here time.sleep(5) |