•11 min read

Getting Started with Katalon Studio + Automating Bootstrap Date Pickers

Getting Started with Katalon Studio + Automating Bootstrap Date Pickers

Katalon Studio isn't the tool everyone talks about in 2025. But if you're doing enterprise QA automation, it saves you from stitching together five different libraries. It wraps Selenium and Appium, gives you a UI, built-in keywords, test management, and reporting out of the box.

This guide covers getting it running on Linux, working around a JVM version issue, and automating a Bootstrap date picker with dynamic XPath. I'll also show you how to handle test data, connect it to a reporting dashboard, and when Katalon actually makes sense over raw Selenium.

Audio Briefing
0:00 / 0:00
What to Expect

We'll search for a product and pick a target date using XPath variables passed at runtime. By the end you'll have a script that handles arbitrary dates without string concatenation or brittle selectors.


Why Katalon Instead of Selenium Directly?

The honest answer: Katalon is a wrapper, and wrappers have tradeoffs.

Use Katalon when:

  • Your team includes non-developers who need to record and run tests
  • You need built-in test management, execution reports, and Jira integration without setting up a separate tool
  • You're targeting web, mobile, desktop, and API tests from the same framework
  • You need a free alternative to UFT/QTP with a UI

Stick to raw Selenium when:

  • Your team is all developers comfortable in code
  • You want maximum control over the framework
  • You're already invested in Playwright or Cypress, which have better modern browser support
  • You need to run inside a monorepo CI pipeline without a GUI

Katalon adds overhead: a 400MB download, a JVM, and a proprietary project format. The payoff is a significant reduction in framework boilerplate for teams that need it.


Advertisement

1. Setting Up Katalon Studio on Linux

Download the Archive

Download the latest Katalon Studio Enterprise for Linux using wget:

wget https://download.katalon.com/10.3.2/Katalon_Studio_Enterprise_Linux_64-10.3.2.tar.gz
tar -xvzf Katalon_Studio_Enterprise_Linux_64-10.3.2.tar.gz
cd Katalon_Studio_Enterprise_Linux_64-10.3.2

Check the Katalon releases page for the current version number before downloading.

Launch It

Run the executable script:

./katalon
Did it crash immediately?

If you see Error: Could not create the Java Virtual Machine., your Java version is too old. Katalon 10.x requires Java 17+. Install Java 17 and point your katalon.ini's -vm argument to the new Java path.

Fixing the JVM Version Mismatch

I hit this exact error the first time. Spent twenty minutes thinking my download was corrupt. It wasn't - my system had Java 11, and Katalon 10.x needs Java 17 minimum.

Step 1: Install Java 17

# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-17-jdk

# Verify
java -version
# openjdk version "17.0.x"

# Find the actual path
which java
# /usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java

Step 2: Update katalon.ini

Open katalon.ini in the extracted directory:

-startup
../plugins/org.eclipse.equinox.launcher_1.6.x.jar
--launcher.library
../plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.2.x/
-vm
/usr/lib/jvm/java-17-openjdk-amd64/bin/java   <-- add this line
-vmargs
-Xms256m
-Xmx2048m

The -vm argument must point to the java binary directly, not a symlink, and it must appear before -vmargs.

Step 3: Launch again

./katalon

If it opens the license activation screen, you're past the JVM issue.


2. Automating the Date Picker

Let's automate the HP LP3065 page from the TutorialsNinja demo site and select 04/Jan/2021.

Why Date Pickers Are Tricky

Bootstrap date pickers don't use native <input type="date"> elements - they're custom JS widgets rendered as a calendar grid. Selenium can't just sendKeys a date string. You have to click through the UI.

The naive approach hardcodes the target year and month as text in your XPath:

//span[text()='2021']   # breaks for 2022
//td[@class='day' and text()='4']   # matches wrong month

The better approach uses parameterized XPath with variables passed at runtime.

Object Repository Setup

Skip the hardcoded locators. Set up your objects in Katalon with dynamic XPath locators:

Object NameXPath Locator
input_Search//input[@name='search']
button_Search//button[contains(@class,'btn-default') and @type='submit']
picker_Year//span[text()='${year}']
picker_Month//span[text()='${month}']
picker_Day//td[@class='day' and text()='${day}']
btn_PreviousYear//th[@class='prev']
btn_NextYear//th[@class='next']
Why Dynamic XPath?

The ${year} syntax lets you pass variables from your script directly into the locator at runtime. The locator template lives in the Object Repository; the data lives in your test script. Change the data, the locator adapts automatically.

The Groovy Script

Here's the full script:

import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI

// Test data - change these three variables to test any date
def targetYear = '2021'
def targetMonth = 'Jan'
def targetDay = '4'

WebUI.openBrowser('http://tutorialsninja.com/demo/')
WebUI.setText(findTestObject('Page_Home/input_Search'), 'HP LP3065')
WebUI.click(findTestObject('Page_Home/button_Search'))

// Wait for product page to load
WebUI.waitForElementVisible(findTestObject('Page_Product/picker_Year', [('year') : targetYear]), 5)

// Pick the date
WebUI.click(findTestObject('Page_Product/picker_Year', [('year') : targetYear]))
WebUI.click(findTestObject('Page_Product/picker_Month', [('month') : targetMonth]))
WebUI.click(findTestObject('Page_Product/picker_Day', [('day') : targetDay]))

The key: ${year}, ${month}, ${day} in the XPath are replaced with the map values you pass to findTestObject. No string concatenation. No brittle selectors.

Want to pick a different date? Change three variables at the top. That's it.


3. Handling Edge Cases

Year Not Visible | Navigate Back

If your target year isn't visible, you need to navigate the picker:

import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import com.kms.katalon.core.model.FailureHandling

def targetYear = '2019'
def targetMonth = 'Jan'
def targetDay = '4'

// Navigate to target year (click "previous" until the year appears)
def maxClicks = 10
def clickCount = 0

while (clickCount < maxClicks) {
    def yearElement = WebUI.findWebElement(
        findTestObject('Page_Product/picker_Year', [('year') : targetYear]),
        2,
        FailureHandling.OPTIONAL
    )
    
    if (yearElement != null) {
        WebUI.click(yearElement)
        break
    }
    
    WebUI.click(findTestObject('Page_Product/btn_PreviousYear'))
    clickCount++
}

if (clickCount >= maxClicks) {
    WebUI.comment("Warning: Could not navigate to year ${targetYear} in ${maxClicks} clicks")
    WebUI.takeScreenshot()
}

FailureHandling.OPTIONAL prevents the test from failing when the element isn't found - it returns null instead. The while loop clicks "previous" until the year appears or the click limit is reached. Add screenshot capture for debugging when it fails.

Month Rollover

The same pattern works for months:

def targetMonth = 'Mar'

while (true) {
    def monthElement = WebUI.findWebElement(
        findTestObject('Page_Product/picker_Month', [('month') : targetMonth]),
        1,
        FailureHandling.OPTIONAL
    )
    
    if (monthElement != null) {
        WebUI.click(monthElement)
        break
    }
    
    WebUI.click(findTestObject('Page_Product/btn_NextMonth'))
}

Advertisement

4. Data-Driven Testing with Test Cases

One of Katalon's genuine strengths over raw Selenium: built-in data binding. Define your test data in a Data File (CSV or Excel) and bind it to your test case - no framework code needed.

Create a Data File (Katalon → New → Test Data):

year,month,day,product
2021,Jan,4,HP LP3065
2022,Mar,15,Canon EOS
2023,Jun,1,Samsung TV

Bind the data in Test Case view:

In the Test Suite, set Data Binding for your test case:

  • Variable targetYear → column year
  • Variable targetMonth → column month
  • Variable targetDay → column day
  • Variable productName → column product

Katalon runs the test once per data row automatically. No loops in your code.

Access bound variables in the script:

// Variables injected from the data file
def targetYear = year    // from binding
def targetMonth = month
def targetDay = day
def productName = productName

WebUI.setText(findTestObject('Page_Home/input_Search'), productName)

5. Reporting and CI Integration

Viewing Reports Locally

After every run, Katalon generates reports in Reports/. The HTML report includes:

  • Pass/fail per step
  • Screenshots on failure
  • Elapsed time per step
  • Browser/OS info

Right-click any test run in the Tests Explorer → View Execution Report.

Running in CI (Headless)

For CI pipelines, run Katalon in console mode:

./katalon \
  -noSplash \
  -runMode=console \
  -projectPath="$(pwd)/MyProject.prj" \
  -testSuitePath="Test Suites/Regression" \
  -browserType="Chrome (headless)" \
  -reportFolder="$(pwd)/reports" \
  -reportFileName="ci-run" \
  -apiKey="$KATALON_API_KEY"

For GitHub Actions:

name: Katalon Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Java 17
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'
      - name: Install Chrome
        run: |
          wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
          sudo sh -c 'echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
          sudo apt-get update && sudo apt-get install -y google-chrome-stable
      - name: Run Tests
        run: |
          ./katalon -noSplash -runMode=console \
            -projectPath="$GITHUB_WORKSPACE/MyProject.prj" \
            -testSuitePath="Test Suites/CI" \
            -browserType="Chrome (headless)" \
            -reportFolder="reports" \
            -apiKey="${{ secrets.KATALON_API_KEY }}"
      - name: Upload Test Report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: katalon-report
          path: reports/

When to Move Off Katalon

Katalon is free for basic usage, but TestOps (cloud execution, advanced reporting, AI features) requires a paid plan. If you find yourself needing those features, compare against:

  • Playwright: better for modern web, faster, open source, excellent TypeScript support
  • Selenium Grid: raw Selenium with parallel execution if you're already invested
  • Cypress: excellent DX for frontend-heavy apps, though limited to browser tests

The Katalon sweet spot is teams that need a single tool covering web, mobile, and API testing without heavy framework investment. Once your QA team is comfortable writing code, moving to Playwright gives you more control and significantly better performance.


Final Thoughts

Katalon Studio won't win any popularity contests in the developer community. But for teams that need a single tool covering web, mobile, API, and desktop - with a UI that non-coders can use - it delivers.

The dynamic XPath approach makes date pickers trivial instead of painful. The data binding makes parametrizing tests a point-and-click operation instead of a framework exercise. And console mode makes CI integration straightforward.

Try it on the TutorialsNinja demo site. Pick a few dates. See how the variables flow through. Then decide if the tradeoffs fit your team's needs.

You Might Also Like

Test Your Knowledge

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement