| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # BitBake Toaster UI tests implementation |
| # |
| # Copyright (C) 2023 Savoir-faire Linux |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| |
| |
| from time import sleep |
| from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException, TimeoutException |
| from selenium.webdriver.common.by import By |
| |
| from orm.models import Build |
| |
| |
| def wait_until_build(test_instance, state): |
| timeout = 60 |
| start_time = 0 |
| build_state = '' |
| while True: |
| try: |
| if start_time > timeout: |
| raise TimeoutException( |
| f'Build did not reach {state} state within {timeout} seconds' |
| ) |
| last_build_state = test_instance.driver.find_element( |
| By.XPATH, |
| '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]', |
| ) |
| build_state = last_build_state.get_attribute( |
| 'data-build-state') |
| state_text = state.lower().split() |
| if any(x in str(build_state).lower() for x in state_text): |
| return str(build_state).lower() |
| if 'failed' in str(build_state).lower(): |
| break |
| except NoSuchElementException: |
| continue |
| except TimeoutException: |
| break |
| start_time += 1 |
| sleep(1) # take a breath and try again |
| |
| def wait_until_build_cancelled(test_instance): |
| """ Cancel build take a while sometime, the method is to wait driver action |
| until build being cancelled |
| """ |
| timeout = 30 |
| start_time = 0 |
| build = None |
| while True: |
| try: |
| if start_time > timeout: |
| raise TimeoutException( |
| f'Build did not reach cancelled state within {timeout} seconds' |
| ) |
| last_build_state = test_instance.driver.find_element( |
| By.XPATH, |
| '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]', |
| ) |
| build_state = last_build_state.get_attribute( |
| 'data-build-state') |
| if 'failed' in str(build_state).lower(): |
| break |
| if 'cancelling' in str(build_state).lower(): |
| # Change build state to cancelled |
| if not build: # get build object only once |
| build = Build.objects.last() |
| build.outcome = Build.CANCELLED |
| build.save() |
| if 'cancelled' in str(build_state).lower(): |
| break |
| except NoSuchElementException: |
| continue |
| except StaleElementReferenceException: |
| continue |
| except TimeoutException: |
| break |
| start_time += 1 |
| sleep(1) # take a breath and try again |
| |
| def get_projectId_from_url(url): |
| # url = 'http://domainename.com/toastergui/project/1656/whatever |
| # or url = 'http://domainename.com/toastergui/project/1/ |
| # or url = 'http://domainename.com/toastergui/project/186 |
| assert '/toastergui/project/' in url, "URL is not valid" |
| url_to_list = url.split('/toastergui/project/') |
| return int(url_to_list[1].split('/')[0]) # project_id |