Boostnote for Code Snippets

After working with Katalon Studio for several months, I have a wealth of code snippets and examples. And with my collection growing each day, where to store them all for easy access? The most common examples are in TypeIt4Me, but the rest need a good storage place that is easily searchable.

There are quite a few code snippet tools available such as Quiver and Snippetslab, but I recently got hooked up with Boostnote and find it’s just what I’m looking for.

Boostnote is a Markdown editor with syntax highlighting for dozens of languages with Groovy, Java, HTML and CSS right there in the mix.

Code can be organized into different folders and each snippet can be tagged for further grouping and easier search. Each snippet can have multiple tabs, so examples, links and other pieces of information can be found under a single header. For example you can have getText and setText examples for Katalon and Selenium tied together.

Boostnote works with Dropbox, Google Drive and other sync tools. It’s available for Windows, macOS and even tablets. Like the Atom editor, it has dozens of UI and Editor theme choices.

Since it has Markdown, I’ve also built a dashboard note with links to Katalon articles, the support forum, documents on my local machine, tutorial videos and blog sites. Both the code and additional resource material is available in one location.

For my needs, Boostnote is a very capable and highly configurable tool that let’s me organize code snippets into categories and allows plenty of flexibility for writing and recalling the next block of code.

boostnote

Other articles of interest:

Using the Katalon Automation Recorder to find Objects

While Katalon Studio has the built in SpyWeb tool, and it works quite well to capture objects and build a repository, I don’t find myself using it that much. Instead, I rely on the Katalon Automation Recorder, the replacement for the Selenium IDE.

I find it quicker to start, and runs alongside the web page. I also find it easier to pick from multiple styles of object paths without all of them being assigned to the object itself.

For those who worked with the Selenium IDE, the interface and usage are almost identical and comes as a Firefox or Chrome plugin. Once running, it’s just a matter of clicking the Inspect button then selecting the object in question. When hovering over an object, it will turn yellow, and when selected, the XPATH will appear. If you want more choices of that object is defined, click the dropdown arrow and additional choices, if available, will be listed. You can also enter a target path, or modify the existing one, then click the magnifying glass to highlight the object in question. This is how I confirm which part of the path can be parameterized.

SpyWeb is good, but I find this a bit faster and more flexible since I’m already in the browser and the object is visible.

I know some prefer to use the Inspect Element function and copy the path from there, but this is another choice.

katalon-automation-recorder

Other articles of interest:

Using Sets to fill in Form Details with Katalon Studio

For a test I was recently working on, there were multiple items that could be selected from the main dropdown, with additional fields to populate that can remain the same. Since the initial dropdown only had a couple of entries, I wanted to confirm each one.

My first thought was to create a List, then pass each entry into the dropdown to fill out the form. While that should work fine, I decided on a different route, creating a Set and then using a “For .. Each” style loop to populate the dropdown.

I hadn’t used a Set in a test before, and wanted to give it a try. It also felt like there would be a few less lines of code going this route.

When completed, the code looks like this:

//Create a set for the different values for the Dropdown. Create an entry for each item
Set stringSet = ["Dropdown1", "Dropdown2", "Dropdown3", "Dropdown4", "Dropdown5"]
stringSet.each { item ->
//Select Dropdown entry
WebUI.selectOptionByLabel(findTestObject('Dropdown Form/select-Dropdown Entry'), item, false)
//Detail Description
WebUI.setText(findTestObject('Dropdown Form/textarea-Description'),
    'This is the Detailed Description for ' + item + ' ' + formattedDate + dateHour)
//Completion Date
WebUI.selectOptionByLabel(findTestObject('Dropdown Form/select-Target Completion Month'), 'June', false)
WebUI.selectOptionByLabel(findTestObject('Dropdown Form/select-Target Completion Year'), '2023', false)
//Save
WebUI.click(findTestObject('Dropdown Form/btn-Save'))
}

There is a lot more to Sets than what I’m doing here, but it lends itself quite well to the task. The Set called stringSet is composed of the text entries listed in the dropdown I want to interact with. Since there are 5 items in the set, the loop will execute 5 times.

The text of stringSet is passed using the selectOptionByLabel command. Where you would normally have the text of the label, I have the variable, “item”, which in turn gets resolved to the text of stringSet.

Once this is passed, the other fields are filled in. The first field is a text box, while the next two fields are dropdowns. Selecting a different completion date and year isn’t of much consequence for this test. The main test is to make sure each of the initial dropdown fields can be selected.

It would be just as easy and as valid to create a List, populate it with the same text, get the size of the List, then use a “For” loop to accomplish the same task. I’m not sure which is better or easier to maintain in the long run, but as mentioned, I hadn’t used the Set method and thought I would give it a try.

Other articles of interest:

Show the currently executing Test Case both before and after it runs

After putting dozens of Test Cases together, I wanted a way to show where one test ended and another began. That way if something failed, I would at least have an idea which Test Case needed debugging or what sort of data was being read that caused the error.

This lead me to add a log.logWarning() command at the start and end of every test case. While this is fine, and works, there is a better way to handle it that requires less user intervention and it’s all but built in to Katalon.

The process is to use a Test Listener. This allows code to be executed at the start and end of every Test Case. In my simple example, the name and the status of the test are written to the log file during execution.

To make the Test Listener, right-click on Test Listener within Katalon Studio and select the options for Before and After a Test Case. Within the sample code, 99% is already written for you. I adjusted it to contain my Logging statements.

The two elements of interest are:

testCaseContext.getTestCaseId()
testCaseContext.getTestCaseStatus()
As reference, this is what my Test Listener looks like. For each test, the "Begin Test" text block is written out, along with the Test Case name. At the end, it's the closing block text and the Test Case name. This is followed by the status of the test case, PASS or FAIL. While this is a pretty meager use of the function, it's extremely handy and since this is the default sample, quite a few people were asking for just this functionality.

class GetTestCaseName {
KeywordLogger log = new KeywordLogger()

/**
* Executes before every test case starts.
* @param testCaseContext related information of the executed test case.
*/

@BeforeTestCase
def sampleBeforeTestCase(TestCaseContext testCaseContext) {
log.logWarning('--- Begin Test --- ' + testCaseContext.getTestCaseId() + ' ---')
}

/**
* Executes after every test case ends.
* @param testCaseContext related information of the executed test case.
*/

@AfterTestCase
def sampleAfterTestCase(TestCaseContext testCaseContext) {
log.logWarning('--- End Test --- ' + testCaseContext.getTestCaseId() + '---')
log.logWarning('Status:= ' + testCaseContext.getTestCaseStatus())
}
}

Other articles of interest:

Sorting in Ascending and Descending order with .toStorted() and .reverse()

Until now my validation of sorted objects has been quite minimal. I’ve gotten by with very simple tests such as IF A>B, IF B>C. However, there is a much better and simpler way to check sorting using the Groovy functions of .toSorted().

numberList=numberList.toSorted()

To make proper use of this, I would read values from a table into a my own List. I would then duplicate that List, sort it, then compare if the two were a match to each other.

However, .toSorted() returns a list in Ascending order. While this is extremely handy, how do you get the List in Descending order?

A second command, .reverse() can be used to quite literally, reverse the list. Since the list is already sorted Ascending, the reverse of that would be Descending.

numberList=numberList.reverse()

In combination with a sorted list it’s not uncommon to need to remove duplicates. The .toUnique() command does just that. The sort of the List is maintained with the duplicate items remove. The List now has the unique items available.

repeatedList=repeatedList.toUnique()

Listed below are a couple of examples to illustrate how each works. Three Lists are created, one with numbers, another with food names and a final with repeated values. The first two are sorted so as to be in Ascending order. The List is then reversed to make it Descending. For the repeated List, the duplicate entries are remove so that the unique spellings for “to” and “for” are kept.

//Lists
numberList = [87453, 974639, 6394, 187298, 435, 205735, 18, 43298, 11340625]
nameList=['Tangerine','Orange','Carrot','Watermelon','Pear','Grape','Banana']
repeatedList=['to','too','two','for','four','fore','too','four','four','for','two']

//Sort Ascending
numberList=numberList.toSorted()
nameList=nameList.toSorted()
log.logWarning('Ascending:=' + numberList)
log.logWarning('Ascending:=' + nameList)

//Sort Descending
numberList=numberList.reverse()
nameList=nameList.reverse()
log.logWarning('Descending:=' + numberList)
log.logWarning('Descending:=' + nameList)

//Unique List
repeatedList=repeatedList.toUnique()
log.logWarning('Unique List:=' + repeatedList)

Output:
Ascending:=[18, 435, 6394, 43298, 87453, 187298, 205735, 974639, 11340625]
Ascending:=[Banana, Carrot, Grape, Orange, Pear, Tangerine, Watermelon]
Descending:=[11340625, 974639, 205735, 187298, 87453, 43298, 6394, 435, 18]
Descending:=[Watermelon, Tangerine, Pear, Orange, Grape, Carrot, Banana]
Unique List:=[to, too, two, for, four, fore]

Other articles of interest:

Recent Comments

  • How To Disable the Quicken Registration Prompt (15)
    • Charlie Fellenbaum: Yay, thanks, and that worked for Quicken 2006 as well.
    • Ken: This didn’t work for me. I have 2006. I installed on a new laptop. I must have registered before, don’t remember. I tried to register this time, but got an error message. I’d rather not registered, though. I use...
    • Neil Murphy: I discovered that early on. I’m using 2001.
    • Jeremy: Thank you so so so much. I am still using Quicken 2010 because Intuit didn’t want to properly support users abroad anymore (never mind that they only link to US banks for transaction downloads; they didn’t want my...
    • Richard: I have Quicken 2016 Home & Business and when I use Shift + CTRL I can’t see any Tools option; All I can see is the original menu items of File & About. Might you be able to offer any advice?
  • Quasi Performance/Load Testing with Katalon Studio (1)
    • Anthony: I have done this with 100 plus machines at the same time and it worked well and provided some useful feedback.
  • A Try Catch example in Katalon Studio (3)
    • Venkatesh: Hi Don Pedro Can you share me sample project ….which consist of basic to advanced stuff…If your github or gitlab url aso present please share… As I am beginer to this I need to learn lot
    • Don Pedro: Hi Lucas. Thank you for the kind comments. I would be happy to help. Let me know how I could be of assistance.
    • Lucas: Thanks for sharing a lot of Katalon tips and tricks. The Katalon team highly appreciate your support and feedback. To make Katalon Studio better and be the best free automation solution for testing community, we wish to coordinate...
  • Securely storing passwords and login details with Set Encrypted Text in Katalon Studio (1)
    • Agus: Hi Don, Is there a way to set the encrypted text to be used in the ‘WebUI.authenticate̵ 7; method? Basically I am trying to encrypt the password that is passed to the ‘WebUI.authenticate̵ 7; method. Thank you.
  • Katalon Studio – Manual View – The start of a test script (2)
    • ben: Hello Don Great Website. Keep up the work. I learnt a lot. cheers Ben.
    • Lucas: Hi Don Pedro, Thanks for sharing a lot of great articles related to Katalon Studio and Selenium. I am Lucas from Katalon team. From your point of view, we’ve learnt alot to improve our product and add more valuable features...
  • Another success with Katalon Studio (1)
    • Mahesh Joshi: Hi Don, I just started following your blog in regards to katalon. I want to introduce katalon studio at my work we do manual testing at work at the moment. What approach I should use for proof of concept with katalon for...
  • What went wrong with Crime City? (34)
    • G D: One thing I have noticed is the awkwardness of items and the attack points and how you can earn them. I was pretty pathetic with attack points and then I played that limited time boss and got weapons that had attack points in the...
  • Disable the Quicken 2012 Registration Prompt (1)
    • Scott: Thanks this worked great and is better then having to upgrade to a subscription!