diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-10-18 22:39:57 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-10-24 11:24:03 +0100 |
commit | 23483ff489f99c4c5f7b33b75d15592fbb1bfde2 (patch) | |
tree | cde57b8c16b33c37f5b9498855696a52201504f9 /bitbake/lib | |
parent | bac01b075611065a087aeb6efe1f85ee751737d8 (diff) | |
download | poky-23483ff489f99c4c5f7b33b75d15592fbb1bfde2.tar.gz |
bitbake: toaster/tests/functiona/project_page_tab_config: Improve waits and drop polling
Drop the poll parameters and make the waits much more specific for
the requirements of the tests. This includes looping waiting for
a list of layer elements as that code was previously particularly
fragile.
(Bitbake rev: cf6b8e8aa5484110a41377ba42b3fdd9d6efd877)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py b/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py index daf00d8f1d..80c53e1544 100644 --- a/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py +++ b/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py | |||
@@ -7,12 +7,12 @@ | |||
7 | # | 7 | # |
8 | 8 | ||
9 | import string | 9 | import string |
10 | import time | ||
10 | import pytest | 11 | import pytest |
11 | from django.urls import reverse | 12 | from django.urls import reverse |
12 | from selenium.webdriver import Keys | 13 | from selenium.webdriver import Keys |
13 | from selenium.webdriver.support.select import Select | 14 | from selenium.webdriver.support.select import Select |
14 | from selenium.common.exceptions import ElementClickInterceptedException, NoSuchElementException, TimeoutException | 15 | from selenium.common.exceptions import ElementClickInterceptedException, NoSuchElementException, TimeoutException |
15 | from orm.models import Project | ||
16 | from tests.functional.functional_helpers import SeleniumFunctionalTestCase | 16 | from tests.functional.functional_helpers import SeleniumFunctionalTestCase |
17 | from selenium.webdriver.common.by import By | 17 | from selenium.webdriver.common.by import By |
18 | 18 | ||
@@ -210,7 +210,7 @@ class TestProjectConfigTab(TestProjectConfigTabBase): | |||
210 | def test_show_rows(row_to_show, show_row_link): | 210 | def test_show_rows(row_to_show, show_row_link): |
211 | # Check that we can show rows == row_to_show | 211 | # Check that we can show rows == row_to_show |
212 | show_row_link.select_by_value(str(row_to_show)) | 212 | show_row_link.select_by_value(str(row_to_show)) |
213 | self.wait_until_visible('#imagerecipestable tbody tr', poll=3) | 213 | self.wait_until_visible('#imagerecipestable tbody tr') |
214 | # check at least some rows are visible | 214 | # check at least some rows are visible |
215 | self.assertTrue( | 215 | self.assertTrue( |
216 | len(self.find_all('#imagerecipestable tbody tr')) > 0 | 216 | len(self.find_all('#imagerecipestable tbody tr')) > 0 |
@@ -289,6 +289,9 @@ class TestProjectConfigTab(TestProjectConfigTabBase): | |||
289 | self.assertIn( | 289 | self.assertIn( |
290 | f'You have changed the {item_name} to: {new_item_name}', change_notification.text | 290 | f'You have changed the {item_name} to: {new_item_name}', change_notification.text |
291 | ) | 291 | ) |
292 | hide_button = self.find('#hide-alert') | ||
293 | hide_button.click() | ||
294 | self.wait_until_not_visible('#change-notification') | ||
292 | 295 | ||
293 | # Machine | 296 | # Machine |
294 | check_machine_distro(self, 'machine', 'qemux86-64', 'machine-section') | 297 | check_machine_distro(self, 'machine', 'qemux86-64', 'machine-section') |
@@ -304,35 +307,44 @@ class TestProjectConfigTab(TestProjectConfigTabBase): | |||
304 | # Layers | 307 | # Layers |
305 | title = layers.find_element(By.TAG_NAME, 'h3') | 308 | title = layers.find_element(By.TAG_NAME, 'h3') |
306 | self.assertIn("Layers", title.text) | 309 | self.assertIn("Layers", title.text) |
310 | self.wait_until_clickable('#layer-add-input') | ||
307 | # check at least three layers are displayed | 311 | # check at least three layers are displayed |
308 | # openembedded-core | 312 | # openembedded-core |
309 | # meta-poky | 313 | # meta-poky |
310 | # meta-yocto-bsp | 314 | # meta-yocto-bsp |
311 | layers_list = layers.find_element(By.ID, 'layers-in-project-list') | 315 | layer_list_items = [] |
312 | layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li') | 316 | starttime = time.time() |
317 | while len(layer_list_items) < 3: | ||
318 | layers_list = self.driver.find_element(By.ID, 'layers-in-project-list') | ||
319 | layer_list_items = layers_list.find_elements(By.TAG_NAME, 'li') | ||
320 | if time.time() > (starttime + 30): | ||
321 | self.fail("Layer list didn't contain at least 3 items within 30s (contained %d)" % len(layer_list_items)) | ||
322 | |||
313 | # remove all layers except the first three layers | 323 | # remove all layers except the first three layers |
314 | for i in range(3, len(layers_list_items)): | 324 | for i in range(3, len(layer_list_items)): |
315 | layers_list_items[i].find_element(By.TAG_NAME, 'span').click() | 325 | layer_list_items[i].find_element(By.TAG_NAME, 'span').click() |
326 | |||
316 | # check can add a layer if exists | 327 | # check can add a layer if exists |
317 | add_layer_input = layers.find_element(By.ID, 'layer-add-input') | 328 | add_layer_input = layers.find_element(By.ID, 'layer-add-input') |
318 | add_layer_input.send_keys('meta-oe') | 329 | add_layer_input.send_keys('meta-oe') |
319 | self.wait_until_visible('#layer-container > form > div > span > div') | 330 | self.wait_until_visible('#layer-container > form > div > span > div') |
320 | dropdown_item = self.driver.find_element( | 331 | self.wait_until_visible('.dropdown-menu') |
321 | By.XPATH, | 332 | finder = lambda driver: driver.find_element(By.XPATH, '//*[@id="layer-container"]/form/div/span/div/div/div') |
322 | '//*[@id="layer-container"]/form/div/span/div' | 333 | dropdown_item = self.wait_until_element_clickable(finder) |
323 | ) | 334 | dropdown_item.click() |
324 | try: | 335 | self.wait_until_clickable('#add-layer-btn') |
325 | dropdown_item.click() | ||
326 | except ElementClickInterceptedException: | ||
327 | self.skipTest( | ||
328 | "layer-container dropdown item click intercepted. Element not properly visible.") | ||
329 | add_layer_btn = layers.find_element(By.ID, 'add-layer-btn') | 336 | add_layer_btn = layers.find_element(By.ID, 'add-layer-btn') |
330 | add_layer_btn.click() | 337 | add_layer_btn.click() |
331 | self.wait_until_visible('#layers-in-project-list') | 338 | self.wait_until_visible('#layers-in-project-list') |
332 | # check layer is added | ||
333 | layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li') | ||
334 | self.assertEqual(len(layers_list_items), 4) | ||
335 | 339 | ||
340 | # check layer is added | ||
341 | layer_list_items = [] | ||
342 | starttime = time.time() | ||
343 | while len(layer_list_items) < 4: | ||
344 | layers_list = self.driver.find_element(By.ID, 'layers-in-project-list') | ||
345 | layer_list_items = layers_list.find_elements(By.TAG_NAME, 'li') | ||
346 | if time.time() > (starttime + 30): | ||
347 | self.fail("Layer list didn't contain at least 4 items within 30s (contained %d)" % len(layer_list_items)) | ||
336 | 348 | ||
337 | def test_project_page_tab_importlayer(self): | 349 | def test_project_page_tab_importlayer(self): |
338 | """ Test project page tab import layer """ | 350 | """ Test project page tab import layer """ |
@@ -476,7 +488,7 @@ class TestProjectConfigTabDB(TestProjectConfigTabBase): | |||
476 | # back to project page | 488 | # back to project page |
477 | self.driver.get(url) | 489 | self.driver.get(url) |
478 | 490 | ||
479 | self.wait_until_visible('#project-page', poll=3) | 491 | self.wait_until_visible('#project-page') |
480 | 492 | ||
481 | # Most built recipes | 493 | # Most built recipes |
482 | most_built_recipes = self.driver.find_element( | 494 | most_built_recipes = self.driver.find_element( |
@@ -484,7 +496,7 @@ class TestProjectConfigTabDB(TestProjectConfigTabBase): | |||
484 | title = most_built_recipes.find_element(By.TAG_NAME, 'h3') | 496 | title = most_built_recipes.find_element(By.TAG_NAME, 'h3') |
485 | self.assertIn("Most built recipes", title.text) | 497 | self.assertIn("Most built recipes", title.text) |
486 | # check can select a recipe and build it | 498 | # check can select a recipe and build it |
487 | self.wait_until_visible('#freq-build-list', poll=3) | 499 | self.wait_until_visible('#freq-build-list') |
488 | recipe_list = self.find('#freq-build-list') | 500 | recipe_list = self.find('#freq-build-list') |
489 | recipe_list_items = recipe_list.find_elements(By.TAG_NAME, 'li') | 501 | recipe_list_items = recipe_list.find_elements(By.TAG_NAME, 'li') |
490 | self.assertTrue( | 502 | self.assertTrue( |