Katalon Studio

Checking for Page Load with a Custom Keyword

While looking through my code, I decided to set up a single validation test that would check to make sure the page I wanted to work with loaded correctly. Instead of repeatedly using 10-15 lines to do it a few different ways, it seemed the better choice would be to create a Custom Keyword and use one line of code to call it each time.

To that end, I set up this simple, but rather effective Custom Keyword that looks for header text on the page I’m trying to get to. I set up the test to accept my chosen text as a parameter so I can pass it anything.

For each page I go to, there is some sort of header text that identifies the page. It may say Profile or Customer or Sales, but there is something I can use for validation.

I created the following Custom Keyword that simply looks for the header text I pass to it. For example, when the page is loaded, look for the text My Profile on it. If it’s there, the page loaded and the text will execute as expected.

If that text doesn’t appear, meaning some sort of problem has occurred, I get the title of the page, log an error and stop execution. Again, it’s a pretty simple test, but it’s proving quite effective.

@Keyword

def checkPageLoad(String findText) {
/* Confirm the correct page has loaded by looking for the requested text
* The search text is passed to the Keyword from the calling statement
* If the text is missing, determine the kind of error and display more meaningful text
*/
def elementVisible = WebUI.verifyTextPresent(findText, false, FailureHandling.OPTIONAL)
if (elementVisible == false) {
//Get the title of the page and determine the kind of error
def title = WebUI.getWindowTitle()
log.logError('ERROR: The requested page did not load with the following error:= ' + title )
if (title=='There was an error'){
log.logError('ERROR: There is a Data Inconsistency Error')
} else {
log.logError('ERROR: The page could not be found - 404 error')
}
log.logWarning('--- The test ended unexpectedly with errors ---')
KeywordUtil.markFailedAndStop('ERROR: Unable to load the requested page - Test has failed')
}
}

To quickly explain the test:

It uses the WebUI.verifyTextPresent to find the text I passed.

If that text does not appear, it gets the WindowTitle which has an error message.

Based on the page title, one of two error conditions has occurred.

An error notice is written to the log file and the test is marked as Failed.

To call the Keyword and pass it the text I’m expected, I use this:

CustomKeywords.'errorCheck.validateSalesDashboard.checkPageLoad'('My Profile')

If the words, “My Profile” appear on the page, the test runs as normal. If they are missing, the error messages are logged and the test is halted. This gives me a way to make sure each page I interact with loads correctly and that the test is working with the correct page.

This Keyword is now called dozens of times from within my Test Cases. Additionally, I can change this in one source file rather going to each to make a modification. I have saved time and shaved off a few hundred lines worth of code.

Other articles of interest:

Setting up Environment Profiles in Katalon Studio

For those who just upgraded to the new Katalon Studio 5.4 version, you might have noticed the Global Variable button seems to be missing from the right hand side of the app. Actually, it’s been moved and improved and now Katalon supports “profiles” that allows you to set up and populate variables based on environment.

From my previous example, this is where I would store the URL for the site I am working on. When I needed to change environments, I would manually edit my baseurl variable and everything would run fine.

This has now been improved so you can define multiple sets of Global Variables for a profile and choose which one to work with. No more editing between test runs.

My needs are fairly simple at the moment, as I only change baseurl for each test. However, I could add other variables or populate them with different information based on environment. It also saves me having to change the baseurl each time.

By default, whatever you had previously defined for your Global Variables will become the “default” entry under Profiles. Like other items, you can Copy that profile, and Paste it into the folder to create variable sets for each environment.

I have created three Profiles, one for QA, one for a Feature/Staging environment and one for Production.

katalon-profiles

With these defined, I simply change to the environment I want to work with and the baseurl is automatically changed without me having to type anything.

select-profile

This is a very handy feature and only took a few minutes to incorporate into my existing project.

Other articles of interest:

Securely storing passwords and login details with Set Encrypted Text in Katalon Studio

One of the new features for Katalon Studio 5.4 is the ability to store encrypted passwords right inside the test case using the Set Encrypted Text command. Previously, the username and password would be in clear text, so anyone who opened the file could see the login credentials. This now obscures that information while still allowing easy access.

The new command is available while editing the script in Manual mode. Change the normal Set Text command to Set Encrypted text, which brings up a small dialog window that encrypts the text as you type.

set-encrypted-text

With the Item column now changed, double click the input field to bring up the encrypted text dialog box. On this new input screen, click the Value input field and you will be able to type in your text and see the encrypted text. This is what will be saved in the Test Case.

input-encrypted-text

For the login test I have, I check to see which environment the test is running against and then pass the credentials for that environment. By simply changing the Set Text command to Set Encrypted Text, I obscured the username and password in mere moments.

The test now looks like this:

if (GlobalVariable.baseurl == 'https://myqasite.com') {
    //QA credentials
log.logWarning('Logging in to environment - ' + GlobalVariable.baseurl)
    WebUI.setEncryptedText(findTestObject('Page_Sign In/input_UserName'), 'XJ419vj6YqJLWAYDfHAYjLzfymSmyhCi')
    WebUI.setEncryptedText(findTestObject('Page_Sign In/input_Password'), 'e71pytG/LEFOTYb/96yNYh7DOujSLkGz')
} else {
//Staging and Prod credentials
log.logWarning('Logging in to environment - ' + GlobalVariable.baseurl)
    WebUI.setEncryptedText(findTestObject('Page_Sign In/input_UserName'), 'cbbsN3ywIVYTVYg1DVaCdC/EYK/MbMZwGmSPgZHWhNTAx6OdO9Wh9w===')
    WebUI.setEncryptedText(findTestObject('Page_Sign In/input_Password'), 'MihRDM3OZ2lC85FtfophvXwNOqe+xiW4fjG2a5CVrjqCtbHeBRcgvw==')
}
WebUI.click(findTestObject('Page_Sign In/span_Sign in'))

This is a pretty nice feature, and even if you’re just working in a QA or Staging environment, it’s nice to now you can obscure sensitive text from others who might be working on the same project, or from someone who might take a glance at the screen.

Other articles of interest:

Quasi Performance/Load Testing with Katalon Studio

For real load testing scenarios there are dedicated tools. But, if you need a quick way to generate traffic from multiple users hitting the same page or pages, you can launch Katalon multiple times from the command line. Katalon will jump through pages far faster than you can do it manually, which can give an approximation of user load.

The first thing to do is to build a Test Suite that runs all the Test Cases you’re interested in. This could be test cases that fill in forms, click a series of link, or load one page after another.

Once that’s done, use the Build CMD button from the menu bar to generate the command line that launches Katalon and your Test Suite.

katalon-build-cmd

Open a Terminal prompt and switch to the Applications directory. Paste in the command line to load Katalon and start the test. After launching the first instance, open a new Terminal tab, switch to the Application directory and paste the command line again. Repeat several times to get multiple instances of Katalon and your browser running.

cd /Applications/

./Katalon\ Studio.app/Contents/MacOS/katalon –args -noSplash  -runMode=console -projectPath=”/Users/XXX/Documents/GitHub/katalon/examples/Test1.prj” -retry=0 -testSuitePath=”Test Suites/New Test Suite” -browserType=”Chrome”

In each tab, Katalon will load and start executing the test. You should quickly see multiple browsers all running the defined Test Suite and pages loading.

Keep in mind, each execution is a full load of Katalon and the browser, so it will consume a fair bit of CPU power and RAM. My Mac Pro has 12 cores and 128GB of ram, so I’ve had 10 consecutive sessions running without incident. I could have easily opened more, but the traffic seemed sufficient. And to be honest, it was pretty amusing to watch.

This method clearly doesn’t compete with tools like Apache Jmeter, and I don’t know if Katalon condones such things, but if you need something quick, and have a good set of tests that can load a lot of pages, this works quite well.

Other articles of interest:

Creating a Data Driven Test Suite in Katalon Studio

In order to extend the reach of my regression tests, I wanted to run a Test Suite multiple times for different users, one after the other. My goal is to log in as User A, run the regression suite, log in as User B, run the regression script again.

For example, I want to log in as John, check multiple pages worth of sales figures to perform calculations and comparisons. I then want to log in as Jane and do the same thing.

I currently have a Login script that I edit between each run with the name of the user I want to be. It works, but I want it to run for a list of users rather than me having to make an edit between each run.

Katalon supports Data Driven tests, where you can supply information to be read from a file. However, that applies to a single Test Case, not a Test Suite. It means the Test Case will iterate through all the data in the file before moving on to the next Test Case in the list.

Based on the scenario above, it would log in for User A, then immediately log in for User B, then User C, and continue do this for each name in the file. At the end of the list, the next test in the suite would be executed. It would read the sales data for the last person in the list.

What I need is for the data to be applied at the Suite level, which isn’t currently supported. However, there is a way to make this work that only takes a couple of steps. In essence, the Login script call numerous Test Cases after reading in the name of the user. It’s not quite as drag and drop as building a Test Suite, but it works.

To convert my Test Suite to work in my Test Case I took the following steps. Since the Test Suite is an XML file it can be easily read. Using a Terminal session and grep, I grabbed all the <testCaseId> lines and wrote them to a file.

grep "Test Cases" QA\ Regression\ Test.ts > testcases.txt

I now have a list of all my tests in the form:

<testCaseId>Test Cases/Sales Dashboard Tests/Main Dashboard Tests/Check Import Date</testCaseId>

The next step is open the testcases.txt file into an editor or spreadsheet such as LibreOffice. Using the Search and Replace function, strip out the <testCaseId> and </testCaseId> tags. This is now the list of Test Cases we want to run and will be added to the Login script.

From here, it’s easy to combine the callTestCase function and append the name of all the test cases to it.

In a spreadsheet, paste all the Test Cases into Column A.

In Column B enter:

WebUI.callTestCase(findTestCase('

In Column C, enter:

'), [:], FailureHandling.CONTINUE_ON_FAILURE)

In Column D, enter

=B1&A1&C1

This takes the callTestCase command, appends the name of the actual test case, then appends the closing syntax. This generates:

WebUI.callTestCase(findTestCase('Test Cases/Sales Dashboard Tests/Main Dashboard Tests/Check Import Date'), [:], FailureHandling.CONTINUE_ON_FAILURE)

Fill this formula down for each Test Case.

With all the commands complete, copy the entire list into the Test Case you want to iterate through, in my case, Login.

The final test case will look similar to:

WebUI.navigateToUrl(GlobalVariable.baseurl + '/login')
WebUI.setText(findTestObject('Page_/input_login_Field'), impersonateUser)
WebUI.delay(1)
WebUI.click(findTestObject('Page_/btn_Submit-Login-Credentials'))
WebUI.delay(1)
WebUI.callTestCase(findTestCase('Test Cases/Sales Dashboard Tests/Main Dashboard Tests/Check Import Date'), [:], FailureHandling.CONTINUE_ON_FAILURE)
WebUI.callTestCase(findTestCase('Test Cases/Sales Dashboard Tests/Main Dashboard Tests/Confirm Dashboard Link'), [:], FailureHandling.CONTINUE_ON_FAILURE)

I have 50 callTestCase commands, the full list of my Test Suite, in the Login Test Case. This means my new Test Suite only has 2 Test Cases listed. The first is to load the web page details. The second is the Login test. Login now replaces the previous Test Suite.

When I run this new test, it gets to the Login script, loads a user, then executes 50 regressions tests. When that cycle is complete, it loads the next user and repeats the process.

Also note the FailureHandling.CONTINUE_ON_FAILURE that has been added to each Test Case. This means the regression tests will keep running if one of them fails. Without this, as soon as an error condition is reached, all the tests will be halted. This includes an element missing, the markFailed command and quite a few others.

While not quite as robust as a regular Test Suite, this method works and will allow a series of tests to be run multiple times. It took less than 10 minutes to convert my Test Suite to this method and get it working. For now, it’s a pretty reasonable workaround.

Other articles of interest:

Recent Comments