[Fuego] [PATCH 15/16] Improve Click and Check methods to allow multiple locators

Tim.Bird at sony.com Tim.Bird at sony.com
Fri Mar 30 23:03:28 UTC 2018



> -----Original Message-----
> From: Guilherme Campos Camargo
> Subject: [Fuego] [PATCH 15/16] Improve Click and Check methods to allow
> multiple locators

Need more information here.   In general, there should usually be something
in the description of the commit, even if it just rewords the summary line.
But in this case, more text explaining the methods would have been good.

(but the commit is already applied...)
> 
> Signed-off-by: Guilherme Campos Camargo <guicc at profusion.mobi>
> ---
>  engine/tests/Functional.fuegotest/test_run.py | 105 ++++++++++++++++--
> --------
>  1 file changed, 65 insertions(+), 40 deletions(-)
> 
> diff --git a/engine/tests/Functional.fuegotest/test_run.py
> b/engine/tests/Functional.fuegotest/test_run.py
> index 0370b6f..d433548 100755
> --- a/engine/tests/Functional.fuegotest/test_run.py
> +++ b/engine/tests/Functional.fuegotest/test_run.py
> @@ -13,6 +13,7 @@ import docker
>  import pexpect
>  import requests
>  from selenium import webdriver
> +from selenium.webdriver.common.by import By
>  import selenium.common.exceptions as selenium_exceptions
> 
>  LOGGER = logging.getLogger('test_run')
> @@ -44,6 +45,46 @@ class SeleniumCommand:
>          LOGGER.debug('Executing Selenium Command \'%s\'',
>                       self.__class__.__name__)
> 
> +    @staticmethod
> +    def check_element_text(element, text):
> +        try:
> +            if text in element.text:
> +                LOGGER.\
> +                    debug('  Text \'%s\' matches element.text \'%s\'',
please use " to avoid escaping '.

> +                          text, element.text)
> +                return True
> +            else:
> +                LOGGER.\
> +                    debug('  Text \'%s\' does not match element.text \'%s\'',
please use " to avoid escaping '.

> +                          text, element.text)
> +                return False
> +        except (selenium_exceptions.ElementNotVisibleException,
> +                selenium_exceptions.NoSuchAttributeException,):
> +            LOGGER.error('  Element has no visible Text')
> +            return False
> +
> +    @staticmethod
> +    def click_element(element):
> +        try:
> +            element.click()
> +            LOGGER.debug('  Element clicked')
> +            return True
> +        except (selenium_exceptions.ElementClickInterceptedException,
> +                selenium_exceptions.ElementNotVisibleException,):
> +            LOGGER.error('  Element is not clickable')
> +            return False
> +
> +    @staticmethod
> +    def find_element(context, locator, pattern):
> +        try:
> +            element = context.driver.find_element(locator, pattern)
> +        except selenium_exceptions.NoSuchElementException:
> +            LOGGER.error('  Element not found')
> +            return None
> +
> +        LOGGER.debug('  Element found')
> +        return element
> +
> 
>  class Visit(SeleniumCommand):
>      def __init__(self, url, timeout=10, expected_result=200):
> @@ -69,55 +110,37 @@ class Visit(SeleniumCommand):
> 
> 
>  class CheckText(SeleniumCommand):
> -    def __init__(self, _id, text, expected_result=True):
> -        self._id = _id
> +    def __init__(self, locator, pattern, text='', expected_result=True):
> +        self.pattern = pattern
> +        self.locator = locator
>          self.text = text
>          self.expected_result = expected_result
> 
>      def exec(self, selenium_ctx):
>          super().exec(selenium_ctx)
> 
> -        try:
> -            text = self.driver.find_element_by_id(self._id).text
> -        except Exception:  # TODO: Use proper Exception
> -            return False
> -
> -        LOGGER.debug(
> -            '  Searching for \'%s\' in \'id:%s\'', self.text, self._id)
> -
> -        result = True
> -        if self.text not in text:
> -            LOGGER.error(
> -                '  \'%s\' not found in id \'%s\' with text \'%s\'', self.text,
> -                self._id, text)
> -            result = False
> -
> -        LOGGER.debug('  \'%s\' was found', self.text)
> +        element = SeleniumCommand.\
> +            find_element(selenium_ctx, self.locator, self.pattern)
> +        if element:
> +            result = SeleniumCommand.check_element_text(element, self.text)
> 
>          return result == self.expected_result
> 
> 
> -class ClickLink(SeleniumCommand):
> -    def __init__(self, linktext, expected_result=True):
> -        self.linktext = linktext
> -        self.expected_result = expected_result
> +class Click(SeleniumCommand):
> +    def __init__(self, locator, pattern):
> +        self.pattern = pattern
> +        self.locator = locator
> 
>      def exec(self, selenium_ctx):
>          super().exec(selenium_ctx)
> 
> -        LOGGER.debug(
> -            '  Searching for a link with the text \'%s\'', self.linktext)
> +        element = SeleniumCommand.\
> +            find_element(selenium_ctx, self.locator, self.pattern)
> +        if element:
> +            return SeleniumCommand.click_element(element)
> 
> -        try:
> -            link = self.driver.find_element_by_partial_link_text(self.linktext)
> -            link.click()
> -            LOGGER.debug('  Link found and clicked')
> -            result = True
> -        except selenium_exceptions.NoSuchElementException:
> -            LOGGER.error('  Link not found')
> -            result = False
> -
> -        return result == self.expected_result
> +        return False
> 
> 
>  class Back(SeleniumCommand):
> @@ -529,25 +552,27 @@ def main():
>          # Add Nodes
>          ShExpect('ftc add-nodes docker'),
>          ShExpect('ftc list-nodes -q', r'.*docker.*'),
> -        CheckText(_id='executors', text='master'),
> -        CheckText(_id='executors', text='docker'),
> +        CheckText(By.ID, 'executors', text='master'),
> +        CheckText(By.ID, 'executors', text='docker'),
> 
>          # Add Fuego TestPlan
>          ShExpect('ftc add-jobs -b docker -p testplan_fuego_tests'),
>          ShExpect('ftc list-jobs', r'.*docker\.testplan_fuego_tests\.batch.*'),
> 
> -        ClickLink(linktext='docker'),
> -        CheckText(_id='projectstatus',
> +        Click(By.PARTIAL_LINK_TEXT, 'docker'),
> +        CheckText(By.ID, 'projectstatus',
>                    text='docker.testplan_fuego_tests.batch'),
>          Back(),
> 
>          # Install Views
>          ShExpect('ftc add-view batch .*.batch'),
> -        CheckText(_id='projectstatus-tabBar', text='batch'),
> +        CheckText(By.ID, 'projectstatus-tabBar',
> +                  text='batch'),
> 
>          # Start Tests
>          ShExpect('ftc build-jobs *.*.Functional.fuego_board_check'),
> -        CheckText(_id='buildQueue', text='Functional.fuego_board_check'),
> +        CheckText(By.ID, 'buildQueue',
> +                  text='Functional.fuego_board_check'),
>      ]
> 
>      if not execute_tests(args.timeout):
> --
> 2.16.2
> 
> _______________________________________________
> Fuego mailing list
> Fuego at lists.linuxfoundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/fuego


More information about the Fuego mailing list