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
from appium.webdriver.common.appiumby import AppiumBy
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")