Browse Source

Better log messages (locatorType = locator) and support for Lists

bernhardbuhl 4 years ago
parent
commit
e19902e09a

+ 1 - 0
baangt/TestSteps/Exceptions.py

@@ -2,6 +2,7 @@ import logging
 
 logger = logging.getLogger("pyC")
 
+
 class baangtTestStepException(Exception):
     def __init__(self, *args, **kwargs):
         logger.exception(f"Exception occured - aborting. Args: {args}, KWARGS: {kwargs}")

+ 7 - 5
baangt/base/BrowserHandling.py

@@ -182,7 +182,7 @@ class BrowserDriver:
                 argsString = argsString + f" {key}: {value}"
 
         if self.locator:
-            argsString = argsString + f"Locator: {self.locatorType}:{self.locator}"
+            argsString = argsString + f" Locator: {self.locatorType} = {self.locator}"
 
         if logType == logging.DEBUG:
             logger.debug(logText + argsString)
@@ -299,7 +299,7 @@ class BrowserDriver:
                     return self.element.text
             except Exception as e:
                 logger.debug(f"Exception during findByAndWaitForValue, but continuing {str(e)}, "
-                             f"Locator: {self.locatorType}:{self.locator}")
+                             f"Locator: {self.locatorType} = {self.locator}")
                 pass
             time.sleep(0.5)
             duration = time.time() - start
@@ -466,12 +466,13 @@ class BrowserDriver:
             self.locator = id
 
         if loggingOn:
-            self._log(logging.DEBUG, f"Locating Element {self.locatorType}={self.locator}")
+            self._log(logging.DEBUG, f"Locating Element {self.locatorType} = {self.locator}")
 
         successful = self.__tryAndRetry(id, css, xpath, class_name, timeout=timeout)
 
         if not successful and not optional:
-            raise Exceptions.baangtTestStepException(f"Element {self.locatorType}={self.locator} could not be found within timeout of {timeout}")
+            raise Exceptions.baangtTestStepException(f"Element {self.locatorType} = {self.locator} could not be found "
+                                                     f"within timeout of {timeout}")
         return successful
 
     def getURL(self):
@@ -513,7 +514,8 @@ class BrowserDriver:
                 elif class_name:
                     self.element = self.driver.find_element_by_class_name(class_name)
                 elif xpath:
-                    self.element = driverWait.until(ec.visibility_of_element_located((By.XPATH, xpath)))
+                    self.element = driverWait.until(ec.presence_of_element_located((By.XPATH, xpath)))
+                    # self.element = driverWait.until(ec.visibility_of_element_located((By.XPATH, xpath)))
                 wasSuccessful = True
             except StaleElementReferenceException as e:
                 self._log(logging.DEBUG, "Stale Element Exception - retrying " + str(e))

+ 1 - 1
baangt/base/TestRun.py

@@ -51,7 +51,7 @@ class TestRun:
         Take overall Time spent for the complete TestRun
         Write results of TestRun to output channel(s)
         """
-        if not self.globalSettings.get(GC.EXECUTION_DONTCLOSEBROWSER):
+        if not self.globalSettings.get("TC." + GC.EXECUTION_DONTCLOSEBROWSER):
             for browserInstance in self.browser.keys():
                 self.browser[browserInstance].closeBrowser()
 

+ 35 - 2
baangt/ui/ImportKatalonRecorder.py

@@ -60,7 +60,8 @@ click | //div[@id='main']/div[2]/div/div[2]/div/div[5]/button/div[2] |
 
             if lEvent == 'Save':
                 self.fileNameExport = sg.popup_get_text("Name of new Testcase:")
-                self.saveTestCase()
+                if self.fileNameExport:
+                    self.saveTestCase()
 
             if lEvent == "TextIn": # Textinput in TextIn
                 self.__importTranslateAndUpdate(lWindow=lWindow)
@@ -108,6 +109,8 @@ click | //div[@id='main']/div[2]/div/div[2]/div/div[5]/button/div[2] |
 
     def saveTestCaseExecution(self, worksheet):
         for row, line in enumerate(self.outputFormatted, start=1):
+            if not line:
+                continue
             for col, (key, value) in enumerate(line.items()):
                 self.writeCell(worksheet, row, col, value)
 
@@ -168,6 +171,8 @@ click | //div[@id='main']/div[2]/div/div[2]/div/div[5]/button/div[2] |
             return ImportKatalonRecorder.__fillDict("GOTOURL", "", locator)
         elif command == 'goBackAndWait' or command == 'goBack':
             return ImportKatalonRecorder.doTranslategoBackAndWait()
+        elif command == 'select':
+            return ImportKatalonRecorder.doTranslateSelect(locator)
         else:
             logger.exception(f"Translation for command not implemented: {command}")
             return None
@@ -185,7 +190,18 @@ click | //div[@id='main']/div[2]/div/div[2]/div/div[5]/button/div[2] |
         return ImportKatalonRecorder.__fillDict("goBack", "")
 
     @staticmethod
+    def doTranslateSelect(locator):
+        return ImportKatalonRecorder.__fillDict("select", locator)
+
+    @staticmethod
     def __fillDict(activity, locator, value="", locatorType='xpath'):
+        if activity == 'select':
+            activity = 'click'
+            return {"Activity": "click",
+                    "LocatorType": locatorType,
+                    "Locator": ImportKatalonRecorder.doTranslateLocator(locator, "select"),
+                    "Value": str(value)}
+
         return {"Activity": activity,
                 "LocatorType": locatorType,
                 "Locator": ImportKatalonRecorder.doTranslateLocator(locator),
@@ -193,10 +209,27 @@ click | //div[@id='main']/div[2]/div/div[2]/div/div[5]/button/div[2] |
                 }
 
     @staticmethod
-    def doTranslateLocator(locator):
+    def doTranslateLocator(locator, specialInstructions=None):
+
         if "xpath=" in locator:
             # he comes with xpath=(//button[@type='button'])[5]
             locator = locator.replace("xpath=", "")
+        if locator[0:3].upper() == "ID=":
+            # This is an ID. Translate the ID to proper xpath-Syntax
+            if specialInstructions == "select":
+                preLocator = "//select[@id='"
+            else:
+                preLocator = "//*[@id='"
+            postLocator = "']"
+            locator = locator[3:]
+            locator = preLocator + locator + postLocator
+        if locator[0:5].upper() == 'LINK=':
+            # //a[text()='text_i_want_to_find']/@href --> Didn't work. Return Text and Selenium can't handle that
+            # //a[contains(., 'Button')]
+            preLocator = "//a[contains(., '"
+            postLocator = "')]"
+            locator = locator[5:]
+            locator = preLocator + locator + postLocator
         return locator
 
     def exportResult(self):