Sample Custom Keywords in Katalon Studio
Sample Custom Keywords in Katalon Studio
When creating a New Custom Keyword, you have the options to generate
sample custom keywords used for either Web, Mobile or API testing. They
provide a great example to learn how to create custom keywords with proper
coding convention in Katalon Studio from scratch.
The options are displayed directly when you create a new custom keyword.
Option Description
Generate sample keywords for Web Generate some sample functions used for Web Testing
Generate sample keywords for Mobile Generate some sample functions used for Mobile Testing
Generate sample keywords for API Generate some sample functions used for API Testing
You can select one or all of these options to have all sample custom keywords
generated in one file. For example, select all options, the generated custom
keyword will look like as below:
class sampleKeywords {
/**
* Refresh browser
*/
@Keyword
def refreshBrowser() {
KeywordUtil.logInfo("Refreshing")
WebDriver webDriver = DriverFactory.getWebDriver()
webDriver.navigate().refresh()
KeywordUtil.markPassed("Refresh successfully")
}
/**
* Click element
* @param to Katalon test object
*/
@Keyword
def clickElement(TestObject to) {
try {
WebElement element = WebUiBuiltInKeywords.findWebElement(to);
KeywordUtil.logInfo("Clicking element")
element.click()
KeywordUtil.markPassed("Element has been clicked")
} catch (WebElementNotFoundException e) {
KeywordUtil.markFailed("Element not found")
} catch (Exception e) {
KeywordUtil.markFailed("Fail to click on element")
}
}
/**
* Get all rows of HTML table
* @param table Katalon test object represent for HTML table
* @param outerTagName outer tag name of TR tag, usually is TBODY
* @return All rows inside HTML table
*/
@Keyword
def List<WebElement> getHtmlTableRows(TestObject table, String
outerTagName) {
WebElement mailList = WebUiBuiltInKeywords.findWebElement(table)
List<WebElement> selectedRows = mailList.findElements(By.xpath("./"
+ outerTagName + "/tr"))
return selectedRows
}
/**
* Check if element present in timeout
* @param to Katalon test object
* @param timeout time to wait for element to show up
* @return true if element present, otherwise false
*/
@Keyword
def isElementPresent_Mobile(TestObject to, int timeout){
try {
KeywordUtil.logInfo("Finding element with id:" + to.getObjectId())
WebElement element =
MobileElementCommonHelper.findElement(to, timeout)
if (element != null) {
KeywordUtil.markPassed("Object " + to.getObjectId() + " is
present")
}
return true
} catch (Exception e) {
KeywordUtil.markFailed("Object " + to.getObjectId() + " is not
present")
}
return false;
}
/**
* Get mobile driver for current session
* @return mobile driver for current session
*/
@Keyword
def WebDriver getCurrentSessionMobileDriver() {
return MobileDriverFactory.getDriver();
}
/**
* Send request and verify status code
* @param request request object, must be an instance of RequestObject
* @param expectedStatusCode
* @return a boolean to indicate whether the response status code equals
the expected one
*/
@Keyword
def verifyStatusCode(TestObject request, int expectedStatusCode) {
if (request instanceof RequestObject) {
RequestObject requestObject = (RequestObject) request
ResponseObject response =
WSBuiltInKeywords.sendRequest(requestObject)
if (response.getStatusCode() == expectedStatusCode) {
KeywordUtil.markPassed("Response status codes match")
} else {
KeywordUtil.markFailed("Response status code not match.
Expected: " +
expectedStatusCode + " - Actual: " +
response.getStatusCode() )
}
} else {
KeywordUtil.markFailed(request.getObjectId() + " is not a
RequestObject")
}
}
/**
* if a key is given make an object of objects by this data column key,
otherwise make it an object of an array for each line
* E.g. use method like such Map propertiesJSON =
sampleKeywords.toJSONByKey(findTestData('Other/properties'),'env')
* @param TestData
* @param String
* @return
*/
@Keyword
def toJSONByKey(TestData data,String key=null){
String []columnNames = data.getColumnNames()
JsonSlurper slurper = new JsonSlurper()
Map dataJSON = key == null ? [:] : slurper.parseText('{}')
for (def index : (1..data.getRowNumbers())){
dataJSON[key == null ? index-1 : data.getValue(key,
index)]=slurper.parseText('{}')
for (def col : (1..data.getColumnNumbers())) {
String columnName = columnNames[col-1]
String cellValue = data.getValue(col,index).trim()
dataJSON[key == null ? index-1 : data.getValue(key, index)]
[columnName]=cellValue
}
}
return dataJSON
}
/**
* Add Header basic authorization field,
* this field value is Base64 encoded token from user name and password
* @param request object, must be an instance of RequestObject
* @param username username
* @param password password
* @return the original request object with basic authorization header field
added
*/
@Keyword
def addBasicAuthorizationProperty(TestObject request, String username,
String password) {
if (request instanceof RequestObject) {
String authorizationValue = username + ":" + password
authorizationValue = "Basic " +
authorizationValue.bytes.encodeBase64().toString()
// Find available basic authorization field and change its value to
the new one, if any
List<TestObjectProperty> headerProperties =
request.getHttpHeaderProperties()
boolean fieldExist = false
for (int i = 0; i < headerProperties.size(); i++) {
TestObjectProperty headerField = headerProperties.get(i)
if (headerField.getName().equals('Authorization')) {
KeywordUtil.logInfo("Found existent basic authorization
field. Replacing its value.")
headerField.setValue(authorizationValue)
fieldExist = true
break
}
}
if (!fieldExist) {
TestObjectProperty authorizationProperty = new
TestObjectProperty("Authorization",
ConditionType.EQUALS, authorizationValue, true)
headerProperties.add(authorizationProperty)
}
KeywordUtil.markPassed("Basic authorization field has been added
to request header")
} else {
KeywordUtil.markFailed(request.getObjectId() + "is not a
RequestObject")
}
return request
}
}