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

Guilherme Camargo guicc at profusion.mobi
Tue Apr 3 03:22:41 UTC 2018


On Fri, Mar 30, 2018 at 11:03:28PM +0000, Tim.Bird at sony.com wrote:
> 
> 
> > -----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...)

Sorry about that. In future commits I'll make sure to have non-empty
descriptions.

Same for this one. Please let me know if you want me to send a fixup.

> > 
> > 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