In the BasePage.py file we need to create BasePage class under base package and we need to define all the required methods which are helpful for automation of the application under test.
In this class we used to create user defined methods such as [ waitForElement , clickElement, sendText , isDisplayed etc. ] from appium predefined methods along with log information which takes screenshots and appends the logs in reporting tool when test cases are failed.
First we need to create an initialization method ( __init__(self) ) which takes a driver object and now we need to create all the required methods.
Example :
Here we are creating a customized method for clicking on an element. We need to mention under the exception handling because if an element is not identified it will print the customized log and proceed the test execution without abort test execution.
def clickOnElement(self, locatorValue, locatorType="id"): try: locatorType = locatorType.lower() webElement = self.waitForElement(locatorValue, locatorType) webElement.click() self.log.info( "Clicked on WebElement with locator value " + locatorValue + " using locatorType " + locatorType) except: self.log.error( "Unable to Click on WebElement with locator value " + locatorValue + " using locatorType " + locatorType) print_stack() assert False
BasePage.py
import allure from allure_commons.types import AttachmentType from selenium.common.exceptions import ElementNotVisibleException, ElementNotSelectableException, NoSuchElementException from selenium.webdriver.support.wait import WebDriverWait import AppiumFrameWork.utilities.CustomLogger as cl import time class BasePage: log = cl.customLogger() def __init__(self, driver): self.driver = driver def waitForElement(self, locatorvalue, locatorType): locatorType = locatorType.lower() element = None wait = WebDriverWait(self.driver, 25, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException, NoSuchElementException]) if locatorType == "id": element = wait.until(lambda x: x.find_element(AppiumBy.ID,locatorvalue)) return element elif locatorType == "class": element = wait.until(lambda x: x.find_element(AppiumBy.CLASS_NAME,locatorvalue)) return element elif locatorType == "des": element = wait.until( lambda x: x.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'UiSelector().description("%s")' % (locatorvalue))) return element elif locatorType == "index": element = wait.until( lambda x: x.find_element(AppiumBy.ANDROID_UIAUTOMATOR,"UiSelector().index(%d)" % int(locatorvalue))) return element elif locatorType == "text": element = wait.until(lambda x: x.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'text("%s")' % locatorvalue)) return element elif locatorType == "xpath": element = wait.until(lambda x: x.find_element(AppiumBy.XPATH,'%s' % (locatorvalue))) return element else: self.log.info("Locator value " + locatorvalue + "not found") return element def getElement(self, locatorValue, locatorType="id"): try: locatorType = locatorType.lower() element = self.waitForElement(locatorValue, locatorType) self.log.info("Element found with LocatorType: " + locatorType + " with the locatorValue :" + locatorValue) except: self.log.error( "Element not found with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue) self.takeScreenshot(locatorType) assert False return element def clickElement(self, locatorValue, locatorType="id"): try: locatorType = locatorType.lower() element = self.getElement(locatorValue, locatorType) element.click() self.log.info( "Clicked on Element with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue) except: self.log.error( "Unable to click on Element with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue) self.takeScreenshot(locatorType) assert False def sendText(self, text, locatorValue, locatorType="id"): try: locatorType = locatorType.lower() element = self.getElement(locatorValue, locatorType) element.send_keys(text) self.log.info( "Send text on Element with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue) except: self.log.error( "Unable to send text on Element with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue) self.takeScreenshot(locatorType) def isDisplayed(self, locatorValue, locatorType="id"): try: locatorType = locatorType.lower() element = self.getElement(locatorValue, locatorType) element.is_displayed() self.log.info( " Element with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue + "is displayed ") return True except: self.log.error( " Element with LocatorType: " + locatorType + " and with the locatorValue :" + locatorValue + " is not displayed") self.takeScreenshot(locatorType) return False def screenShot(self, screenshotName): fileName = screenshotName + "_" + (time.strftime("%d_%m_%y_%H_%M_%S")) + ".png" screenshotDirectory = "../screenshots/" screenshotPath = screenshotDirectory + fileName try: self.driver.save_screenshot(screenshotPath) self.log.info("Screenshot save to Path : " + screenshotPath) except: self.log.error("Unable to save Screenshot to the Path : " + screenshotPath) def takeScreenshot(self, text): allure.attach(self.driver.get_screenshot_as_png(), name=text, attachment_type=AttachmentType.PNG) def keyCode(self, value): self.driver.press_keycode(value) def scrollElement(self, locatorValue, locatorType): try: locatorType = locatorType.lower() wait = WebDriverWait(self.driver, 25, poll_frequency=1, ignored_exceptions=None) element = wait.until(lambda x: x.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiScrollable(new UiSelector()).scrollIntoView(%s("%s"))' %(locatorType, locatorValue))) element.click() except: self.log.error("Unable to scroll")