Unable to create logger and LogViewer doesn't works

When I start an automated test case (MacBook Pro M5, Katalon 11.2.0 from behind a business VPN and Proxy) I see in the console log the following timeout:

2026-06-24 16:22:13.068 INFO c.k.k.c.l.logback.LogbackConfigurator - Logback default configuration initialized from: /Applications/Katalon Studio v11.1.1.app/Contents/Eclipse/configuration/org.eclipse.osgi/151/0/.cp/resources/logback/logback-execution.xml
2026-06-24 16:22:13.069 INFO c.k.k.c.l.logback.LogbackConfigurator - Logback custom configuration initialized from: /Users/xxxxxxxxx/Projects/xxxxxxxxxxxxxx/Include/config/log.properties
2026-06-24 16:22:13.186 INFO c.k.katalon.core.main.TestSuiteExecutor - START Test Suites/xxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxx

β€œUnable to create logger. Root cause (Operation timed out).”

2026-06-24 16:22:21.012 INFO c.k.katalon.core.main.TestSuiteExecutor - userFullName =
2026-06-24 16:22:21.012 INFO c.k.katalon.core.main.TestSuiteExecutor - projectName =

…

moreover Logviewer remains blank without showing progress and steps.

How can I fix it? What is the endpoint and port it’s trying to reach? Is it possible to change it?

Dear Aroldo, our community will jump in and help. Meanwhile, please kindly try this:

  1. Exclude/bypass these from proxy/VPN/security filtering:
    • localhost
    • 127.0.0.1
    • ::1
  2. If your VPN has a β€œproxy all traffic” / β€œsecure web gateway” / β€œinspect localhost traffic” option, turn that off temporarily and retry.
  3. Check macOS firewall / security agent rules and allow Katalon Studio / bundled Java to open loopback sockets.
  4. Fully quit Studio, then retry without VPN once. If it works, that confirms the local-network interception hypothesis.
  5. Reinstall / launch the exact expected app version once, because your log says:
    • /Applications/Katalon Studio v11.1.1.app/...
      even though you mentioned 11.2.0. That mismatch is worth checking.

This definitely looks more like a network/proxy connectivity issue than a test execution issue.

A few things you should check:

1. Proxy/VPN blocking Katalon services

Try:

  • Disconnecting from the VPN temporarily (if permitted by your organization) and rerun the test.

  • Running from a different network (for example, a mobile hotspot).

If the issue disappears outside the corporate network, then the VPN/proxy/firewall is likely blocking a required Katalon service.

2. Verify that Katalon endpoints are allowed

Ask your network/security team to verify access to Katalon services such as:

If these services are blocked, you may experience:

  • β€œUnable to create logger” timeout errors

  • Blank Log Viewer

  • Missing user/workspace information

  • Analytics/TestOps/TrueTest related connectivity issues

All communication is typically over HTTPS (port 443).

3. Check Proxy configuration in Katalon Studio

Go to:

Windows-> Katalon studio Preferences β†’ Proxy

Verify that:

  • Proxy host and port are correct

  • Authentication settings are configured if required

  • PAC file settings (if used) are valid

4. Clear workspace cache

Workspace metadata corruption can occasionally cause logging and UI issues.

Try closing Katalon Studio, backing up the project, and clearing the workspace cache before reopening the project.

5. Check the detailed stack trace

The most useful information will be in:

.metadata/.log

Look at the lines immediately following:

Unable to create logger. Root cause (Operation timed out)

The full stack trace often reveals the exact hostname, endpoint, and port that Katalon was attempting to reach when the timeout occurred.

6. Verify HTTPS/WebSocket filtering

Some enterprise proxies allow standard HTTPS traffic but block WebSocket connections. Since the Log Viewer relies on live communication, ask your network team whether HTTPS/WebSocket traffic to Katalon services is being filtered or inspected.

And make sure you have not clicked on the green padlock (scroll lock) of the Log Viewer.

image

I looked into the source code of Katalon Studio v11.2.1 to find out which exact statement of which class displayed this message.

I found that the private Logger getLogger() method of the com.kms.katalon.core.logging.XmlKeywordLogger class displayed this message: The following is the source:

package com.kms.katalon.core.logging;

import static com.kms.katalon.core.constants.StringConstants.DF_CHARSET;

import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;
import java.util.logging.SocketHandler;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;

import com.kms.katalon.core.configuration.RunConfiguration;
import com.kms.katalon.core.constants.CoreMessageConstants;
import com.kms.katalon.core.constants.StringConstants;
import com.kms.katalon.core.exception.StepFailedException;
import com.kms.katalon.core.logging.KeywordLogger.KeywordStackElement;
import com.kms.katalon.core.main.SecureDataMasker;
import com.kms.katalon.core.util.TestCloudPropertyUtil;
import com.kms.katalon.core.util.internal.ExceptionsUtil;

class XmlKeywordLogger {

    // Number of log files to allow logging up to 20 GB of logs.
    // Adding one more to detect log overflow.
    public static final int MAXIMUM_LOG_FILES = 2001;

    private static final int MAXIMUM_LOG_FILE_SIZE = 10 * 1024 * 1024; // 10MB

    private Logger logger;

    private String pendingDescription = null;

    private Stack<KeywordStackElement> currentKeywordStack = null;

    private Stack<Stack<KeywordStackElement>> keywordStacksContainer = new Stack<Stack<KeywordStackElement>>();

    private int nestedLevel;

    private SecureDataMasker secureDataMasker;

    private static final ThreadLocal<XmlKeywordLogger> localXmlKeywordLoggerStorage = new ThreadLocal<XmlKeywordLogger>() {

        protected XmlKeywordLogger initialValue() {
            return new XmlKeywordLogger();
        }
    };

    static XmlKeywordLogger getInstance() {
        return localXmlKeywordLoggerStorage.get();
    }

    private XmlKeywordLogger() {
    }

    /**
     * @return Returns current logger if it exists. Otherwise, create a new one includes: customized log file with XML
     * format and customized console handler.
     */
    private Logger getLogger() {
        if (logger == null) {
            logger = Logger.getLogger(XmlKeywordLogger.class.getName());

            // remove default parent's setting
            logger.setUseParentHandlers(false);
        }

        if (isInRunningMode()) {
            String logFolder = getLogFolderPath();
            if (logger.getHandlers().length == 0 && StringUtils.isNotEmpty(logFolder)) {
                try {
                    // Split log into 100 files, every file is maximum 10MB
                    FileHandler fileHandler = new FileHandler(logFolder + File.separator + "execution%g.log",
                            MAXIMUM_LOG_FILE_SIZE, MAXIMUM_LOG_FILES, true);

                    fileHandler.setEncoding(DF_CHARSET);
                    fileHandler.setFormatter(new CustomXmlFormatter());
                    logger.addHandler(fileHandler);

                    SocketHandler socketHandler = new SystemSocketHandler(StringConstants.DF_LOCAL_HOST_ADDRESS,
                            getPort());
                    socketHandler.setEncoding(DF_CHARSET);
                    socketHandler.setFormatter(new CustomSocketLogFomatter());
                    logger.addHandler(socketHandler);
                } catch (SecurityException e) {
                    System.err.println(
                            MessageFormat.format(CoreMessageConstants.MSG_ERR_UNABLE_TO_CREATE_LOGGER, e.getMessage()));
                } catch (IOException e) {
                    System.err.println(
                            MessageFormat.format(CoreMessageConstants.MSG_ERR_UNABLE_TO_CREATE_LOGGER, e.getMessage()));
                }
            }
        }
        return logger;
    }

//...trimmed the following lines

The XmlKeywordLogger is a general purpose utility. It is not closely related to the β€œfrom behind a business VPN and Proxy” issue. As you can see, the getLogger() method, which displayed the β€œUnable to create logger” message, has nothing to do with VPN and Proxy. I suspect the Katalon Studio installation of @aroldo.nola is somewhat broken.

@aroldo.nola

How long have you been working with the current installation of Katalon Studio? Have you successfully executed your tests a lot of times preveiously with your current environment? You just upgraded Katalon Studio and encountered this problem, no? Could you try uninstall and reinstall Katalon Studio? Be sure to stop and restart your PC.

Hi, but if I disable the VPN, I don’t get the error on the logger and the logViewer works properly, but my tests fails because they require the company network to work.

This is why I was wondering how to find out which port or endpoint I need to open.

I also tried removing the app and reinstalling it, but nothing changed. I previously used Katalon and didn’t have any problems.

My previous workstation was a PC with Katalon 9.x and 10.x, while now I’m on a Mac with Katalon 11.x.
It never worked on a Mac, while I’ve never had this problem on a PC.
The VPN β€œshould” be the same :slight_smile: but everything has changed, completely, to make a comparison.

I don’t see what’s wrong. It’s only you who can investigate your system and network in your hand.

If you let me suggest, check your project’s Proxy Preferences. Compare if the proxy setting is identical on Windows + Katalon 10, and on Mac + Katalon 11. You may have changed the proxy setting on Mac + Katalon 11 unintentionally, which caused a mess. Also let me remind you that Katalon requires 2 proxies; one for Authentication and one for System. You should check the settings of both.

It looks like your VPN or proxy is blocking Katalon from connecting to its logging service. Try running Katalon without the VPN (if you can) or check your proxy settings. If it still doesn’t work, ask your IT team to allow the required Katalon connections. For the exact endpoint and port, it’s best to check the Katalon documentation or contact their support.

See

hi Mr @kazurayam , where can I find the source code?
thanks

On my Mac, I have Katalon Studio installed in the directory

  • /Applications/Katalon Studio.app

Inside it I found a jar com.kms.katalon.core.webui-sources.jar

$ realpath com.kms.katalon.core.webui-sources.jar 
/Applications/Katalon Studio.app/Contents/Eclipse/configuration/resources/source/com.kms.katalon.core.webui/com.kms.katalon.core.webui-sources.jar

I copied it into a temp dir and unzipped it:

$ cp ./com.kms.katalon.core.webui-sources.jar ~/tmp
:/Applications/Katalon Studio.app/Contents/Eclipse/configuration/resources/source/com.kms.katalon.core.webui
$ cd ~/tmp
:~/tmp
$ ls
com.kms.katalon.core.webui-sources.jar
:~/tmp
$ unzip com.kms.katalon.core.webui-sources.jar 

I got the source of com.kms.katalon.core.webui.*:

$ tree .
.
β”œβ”€β”€ com
β”‚   └── kms
β”‚       └── katalon
β”‚           └── core
β”‚               └── webui
β”‚                   β”œβ”€β”€ authentication
β”‚                   β”‚   └── basic
β”‚                   β”‚       β”œβ”€β”€ BasicAuthenticationStrategy.java
β”‚                   β”‚       β”œβ”€β”€ BasicAuthenticationStrategyFactory.java
β”‚                   β”‚       β”œβ”€β”€ BiDiBasicAuth.java
β”‚                   β”‚       β”œβ”€β”€ CdpBasicAuth.java
β”‚                   β”‚       β”œβ”€β”€ EmbeddedCredentialsUrlBasicAuth.java
β”‚                   β”‚       └── NoOpBasicAuth.java
β”‚                   β”œβ”€β”€ common
β”‚                   β”‚   β”œβ”€β”€ ATCLogMessage.properties
β”‚                   β”‚   β”œβ”€β”€ BaseObject.java
β”‚                   β”‚   β”œβ”€β”€ controller
β”‚                   β”‚   β”‚   β”œβ”€β”€ AbortController.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ ElementWaitingPhase.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForEditablePhase.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForEnabledPhase.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForPageRerender.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForStablePhase.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForTopmostPhase.java
β”‚                   β”‚   β”‚   └── WaitForVisiblePhase.java
β”‚                   β”‚   β”œβ”€β”€ CssLocatorBuilder.java
β”‚                   β”‚   β”œβ”€β”€ EBrowser.java
β”‚                   β”‚   β”œβ”€β”€ ECheckbox.java
β”‚                   β”‚   β”œβ”€β”€ ECombobox.java
β”‚                   β”‚   β”œβ”€β”€ EConfirmMessage.java
β”‚                   β”‚   β”œβ”€β”€ EDateTime.java
β”‚                   β”‚   β”œβ”€β”€ EInput.java
β”‚                   β”‚   β”œβ”€β”€ EKeyboard.java
β”‚                   β”‚   β”œβ”€β”€ EListbox.java
β”‚                   β”‚   β”œβ”€β”€ EngineLogger.java
β”‚                   β”‚   β”œβ”€β”€ EUtil.java
β”‚                   β”‚   β”œβ”€β”€ EWindow.java
β”‚                   β”‚   β”œβ”€β”€ ExecuteCommandAction.java
β”‚                   β”‚   β”œβ”€β”€ FindElementsResult.java
β”‚                   β”‚   β”œβ”€β”€ FontStyle.java
β”‚                   β”‚   β”œβ”€β”€ future
β”‚                   β”‚   β”‚   └── AbortSignal.java
β”‚                   β”‚   β”œβ”€β”€ ImageTextProperties.java
β”‚                   β”‚   β”œβ”€β”€ internal
β”‚                   β”‚   β”‚   β”œβ”€β”€ ImageLocatorController.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ SeleniumBrowserInfo.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ SelfHealingController.java
β”‚                   β”‚   β”‚   └── SmartWait.java
β”‚                   β”‚   β”œβ”€β”€ Result.java
β”‚                   β”‚   β”œβ”€β”€ RunnerService.java
β”‚                   β”‚   β”œβ”€β”€ RunningStatus.java
β”‚                   β”‚   β”œβ”€β”€ ScreenUtil.java
β”‚                   β”‚   β”œβ”€β”€ WebUiCommonHelper.java
β”‚                   β”‚   └── WebUICommonScripts.java
β”‚                   β”œβ”€β”€ constants
β”‚                   β”‚   β”œβ”€β”€ CoreWebuiMessageConstants.java
β”‚                   β”‚   β”œβ”€β”€ coreWebuiMessages.properties
β”‚                   β”‚   β”œβ”€β”€ ElementWaitingScript.java
β”‚                   β”‚   β”œβ”€β”€ HTMLTags.java
β”‚                   β”‚   β”œβ”€β”€ StringConstants.java
β”‚                   β”‚   └── WebUICommonScriptConstants.java
β”‚                   β”œβ”€β”€ contribution
β”‚                   β”‚   β”œβ”€β”€ WebUiDriverCleaner.java
β”‚                   β”‚   └── WebUiKeywordContributor.groovy
β”‚                   β”œβ”€β”€ driver
β”‚                   β”‚   β”œβ”€β”€ AbstractDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ BaseDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ bidi
β”‚                   β”‚   β”‚   └── BiDiDriverUtil.java
β”‚                   β”‚   β”œβ”€β”€ chrome
β”‚                   β”‚   β”‚   β”œβ”€β”€ ChromeDriverBuilder.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ ChromeDriverUtil.java
β”‚                   β”‚   β”‚   └── ChromeHeadlessDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ chromium
β”‚                   β”‚   β”‚   └── ChromiumDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ DriverBuilderFactory.java
β”‚                   β”‚   β”œβ”€β”€ DriverConfigurationProvider.java
β”‚                   β”‚   β”œβ”€β”€ DriverFactory.java
β”‚                   β”‚   β”œβ”€β”€ edge
β”‚                   β”‚   β”‚   β”œβ”€β”€ EdgeChromiumDriverBuilder.java
β”‚                   β”‚   β”‚   └── EdgeDriverUtil.java
β”‚                   β”‚   β”œβ”€β”€ ExistingRemoteWebDriver.java
β”‚                   β”‚   β”œβ”€β”€ ExistingSessionDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ firefox
β”‚                   β”‚   β”‚   β”œβ”€β”€ FirefoxDriverBuilder.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ FirefoxDriverUtil.java
β”‚                   β”‚   β”‚   β”œβ”€β”€ FirefoxHeadlessDriverBuilder.java
β”‚                   β”‚   β”‚   └── webdriver.xpi
β”‚                   β”‚   β”œβ”€β”€ IDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ IDriverConfigurationProvider.java
β”‚                   β”‚   β”œβ”€β”€ KatalonSmartEventListener.java
β”‚                   β”‚   β”œβ”€β”€ MobileDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ remote
β”‚                   β”‚   β”‚   β”œβ”€β”€ AbstractRemoteDriverBuilder.java
β”‚                   β”‚   β”‚   └── GenericRemoteDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ safari
β”‚                   β”‚   β”‚   └── SafariDriverBuilder.java
β”‚                   β”‚   β”œβ”€β”€ smart
β”‚                   β”‚   β”‚   └── SmartDriverUtil.java
β”‚                   β”‚   β”œβ”€β”€ WebMobileDriverFactory.java
β”‚                   β”‚   └── WebUIDriverType.java
β”‚                   β”œβ”€β”€ exception
β”‚                   β”‚   β”œβ”€β”€ AbortException.java
β”‚                   β”‚   β”œβ”€β”€ BrowserNotOpenedException.java
β”‚                   β”‚   β”œβ”€β”€ SeleniumManagerException.java
β”‚                   β”‚   β”œβ”€β”€ WebElementNotFoundException.java
β”‚                   β”‚   └── WebElementNotInteractableException.java
β”‚                   β”œβ”€β”€ helper
β”‚                   β”‚   └── screenshot
β”‚                   β”‚       β”œβ”€β”€ ScreenshotTextHelper.java
β”‚                   β”‚       └── WebUIScreenCaptor.java
β”‚                   β”œβ”€β”€ keyword
β”‚                   β”‚   β”œβ”€β”€ builtin
β”‚                   β”‚   β”‚   β”œβ”€β”€ AcceptAlertKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ AddTraceMarkerKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ AuthenticateKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ BackKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ CheckKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ClearTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ClickKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ClickOffsetKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ CloseBrowserKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ CloseWindowIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ CloseWindowTitleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ CloseWindowUrlKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ConvertWebElementToTestObjectKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DeleteAllCookiesKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DeselectAllOptionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DeselectOptionByIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DeselectOptionByLabelKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DeselectOptionByValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DisableSmartWaitKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DismissAlertKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DoubleClickKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DragAndDropByOffsetKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ DragAndDropToObjectKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ EnableSmartWaitKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ EnhancedClickKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ExecuteJavascriptKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ FindWebElementKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ FindWebElementKeywords.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ FocusKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ForwardKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetAlertTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetAllLinksOnCurrentPageKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetAttributeKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetCSSValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetElementHeight.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetElementLeftPosition.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetElementWidth.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetNumberOfSelectedOptionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetNumberOfTotalOptionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetPageHeightKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetPageWidthKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetUrlKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetViewportHeightKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetViewportLeftPositionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetViewportTopPositionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetViewportWidthKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetWindowIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ GetWindowTitleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ JSClickKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ MaximizeWindowKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ModifyObjectPropertyKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ MouseOverKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ MouseOverOffsetKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ NavigateToMaskedUrlKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ NavigateToUrlKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ NewTabKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ OpenBrowserKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ RefreshKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ RemoveObjectPropertyKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ RightClickKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ RightClickOffsetKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ScrollFromElementKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ScrollFromElementWithOffsetKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ScrollFromViewportOffsetKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ScrollToElementKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ ScrollToPositionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SelectAllOptionKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SelectOptionByIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SelectOptionByLabelKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SelectOptionByValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SendKeysKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SetAlertTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SetEncryptedTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SetMaskedTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SetTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SetViewPortSizeKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SubmitKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SwitchToDefaultContentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SwitchToFrameKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SwitchToWindowIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SwitchToWindowTitleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ SwitchToWindowUrlKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ TakeAreaScreenshotKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ TakeElementScreenshotKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ TakeFullPageScreenshotKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ TakeFullPageScreenshotWithScrollKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ TakeScreenshotKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ UncheckKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ UploadFileKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ UploadFileWithDragAndDrop.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyAlertNotPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyAlertPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyAllLinksOnCurrentPageAccessibleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementAttributeValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementCheckedKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementClickableKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementHasAttributeKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementNotCheckedKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementNotClickableKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementNotHasAttributeKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementNotPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementNotVisibleInViewportKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementNotVisibleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementTextKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementVisibleInViewportKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyElementVisibleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyLinksAccessibleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionNotPresentByLabelKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionNotPresentByValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionNotSelectedByIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionNotSelectedByLabelKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionNotSelectedByValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionPresentByLabelKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionPresentByValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionSelectedByIndexKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionSelectedByLabelKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionSelectedByValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyOptionsPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyTextNotPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ VerifyTextPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForAlertKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForAngularLoadKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementAttributeValueKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementClickableKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementHasAttributeKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementNotClickableKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementNotHasAttributeKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementNotPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementNotVisibleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementPresentKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForElementVisibleKeyword.groovy
β”‚                   β”‚   β”‚   β”œβ”€β”€ WaitForJQueryLoadKeyword.groovy
β”‚                   β”‚   β”‚   └── WaitForPageLoadKeyword.groovy
β”‚                   β”‚   β”œβ”€β”€ internal
β”‚                   β”‚   β”‚   β”œβ”€β”€ WebUIAbstractKeyword.java
β”‚                   β”‚   β”‚   └── WebUIKeywordMain.groovy
β”‚                   β”‚   └── WebUiBuiltInKeywords.groovy
β”‚                   β”œβ”€β”€ model
β”‚                   β”‚   β”œβ”€β”€ ElementFinder.java
β”‚                   β”‚   β”œβ”€β”€ ElementWaitingInteractableState.java
β”‚                   β”‚   β”œβ”€β”€ FindElementParams.java
β”‚                   β”‚   β”œβ”€β”€ FindElementWithTimeoutParams.java
β”‚                   β”‚   β”œβ”€β”€ SeleniumActionRetryController.java
β”‚                   β”‚   β”œβ”€β”€ SeleniumElementFinder.java
β”‚                   β”‚   β”œβ”€β”€ WebUiElementFinder.java
β”‚                   β”‚   β”œβ”€β”€ WebUiElementFinderWithSelfHealing.java
β”‚                   β”‚   β”œβ”€β”€ WebUiElementFinderWithTimeout.java
β”‚                   β”‚   └── WebUiLocatorProvider.java
β”‚                   β”œβ”€β”€ trace
β”‚                   β”‚   β”œβ”€β”€ HarTracer.java
β”‚                   β”‚   β”œβ”€β”€ KeywordInterceptor.groovy
β”‚                   β”‚   β”œβ”€β”€ SnapshotAgent.java
β”‚                   β”‚   └── TraceSession.java
β”‚                   └── util
β”‚                       β”œβ”€β”€ ConsoleCommandExecutor.java
β”‚                       β”œβ”€β”€ FileExcutableUtil.java
β”‚                       β”œβ”€β”€ FileUtil.java
β”‚                       β”œβ”€β”€ OSUtil.java
β”‚                       β”œβ”€β”€ ParseUtil.java
β”‚                       β”œβ”€β”€ StringUtils.java
β”‚                       β”œβ”€β”€ URLUtils.java
β”‚                       β”œβ”€β”€ WebDriverCleanerUtil.java
β”‚                       β”œβ”€β”€ WebDriverPropertyUtil.java
β”‚                       β”œβ”€β”€ WebDriverProxyUtil.java
β”‚                       └── WebDriverUtil.java
β”œβ”€β”€ com.kms.katalon.core.webui-sources.jar
└── META-INF
    β”œβ”€β”€ MANIFEST.MF
    └── maven
        └── com.kms
            └── com.kms.katalon.core.webui
                β”œβ”€β”€ pom.properties
                └── pom.xml

36 directories, 253 files

In the /Applications/Katalon Studio.app/Contents/Eclipse/configuration/resources/source directory, you can find other jar files of Core, Mobile and other com.kms.katalon.core.* packages.

However, please note that the source code of Katalon Studio IDE (Eclipse SWT, etc) is NOT included. It is not disclosed at all.

ah I see. noted with thanks Mr @kazurayam

i thought the code under .app file is obfuscated, turns out it’s not

By the way, I have a Gradle project

This enables me to

  1. extract the version of source code out of Katalon Studio currently installed on my machine to store in a work directory named β€œversions”. See the following example:
$ tree versions -L 4
versions
β”œβ”€β”€ 10.2.0
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 10.2.4
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 10.3.0
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 10.3.1
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 10.3.2
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 10.4.2
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       β”œβ”€β”€ html
β”‚       β”‚   β”œβ”€β”€ html_collection_frame_template.txt
β”‚       β”‚   β”œβ”€β”€ html_collection_index_template.txt
β”‚       β”‚   β”œβ”€β”€ html_content.txt
β”‚       β”‚   β”œβ”€β”€ html_template.txt
β”‚       β”‚   β”œβ”€β”€ html_vars.txt
β”‚       β”‚   β”œβ”€β”€ TestSuiteCollectionTemplate.html
β”‚       β”‚   β”œβ”€β”€ TestSuiteTemplate.html
β”‚       β”‚   └── variables.txt
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.cucumber
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 11.0.0
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       β”œβ”€β”€ html
β”‚       β”‚   β”œβ”€β”€ api_ai_test_report_template.html
β”‚       β”‚   β”œβ”€β”€ html_collection_frame_template.txt
β”‚       β”‚   β”œβ”€β”€ html_collection_index_template.txt
β”‚       β”‚   β”œβ”€β”€ html_content.txt
β”‚       β”‚   β”œβ”€β”€ html_template.txt
β”‚       β”‚   β”œβ”€β”€ html_vars.txt
β”‚       β”‚   β”œβ”€β”€ TestSuiteCollectionTemplate.html
β”‚       β”‚   β”œβ”€β”€ TestSuiteTemplate.html
β”‚       β”‚   └── variables.txt
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.cucumber
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 11.1.1
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       β”œβ”€β”€ html
β”‚       β”‚   β”œβ”€β”€ api_ai_test_report_template.html
β”‚       β”‚   β”œβ”€β”€ html_collection_frame_template.txt
β”‚       β”‚   β”œβ”€β”€ html_collection_index_template.txt
β”‚       β”‚   β”œβ”€β”€ html_content.txt
β”‚       β”‚   β”œβ”€β”€ html_template.txt
β”‚       β”‚   β”œβ”€β”€ html_vars.txt
β”‚       β”‚   β”œβ”€β”€ TestSuiteCollectionTemplate.html
β”‚       β”‚   β”œβ”€β”€ TestSuiteTemplate.html
β”‚       β”‚   └── variables.txt
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.cucumber
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 11.2.1
β”‚   └── resources
β”‚       β”œβ”€β”€ extentions
β”‚       β”‚   └── scripts
β”‚       β”œβ”€β”€ html
β”‚       β”‚   β”œβ”€β”€ api_ai_test_report_template.html
β”‚       β”‚   β”œβ”€β”€ html_collection_frame_template.txt
β”‚       β”‚   β”œβ”€β”€ html_collection_index_template.txt
β”‚       β”‚   β”œβ”€β”€ html_content.txt
β”‚       β”‚   β”œβ”€β”€ html_template.txt
β”‚       β”‚   β”œβ”€β”€ html_vars.txt
β”‚       β”‚   β”œβ”€β”€ TestSuiteCollectionTemplate.html
β”‚       β”‚   β”œβ”€β”€ TestSuiteTemplate.html
β”‚       β”‚   └── variables.txt
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.cucumber
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
β”œβ”€β”€ 8.6.9
β”‚   └── resources
β”‚       └── source
β”‚           β”œβ”€β”€ com.kms.katalon.core
β”‚           β”œβ”€β”€ com.kms.katalon.core.mobile
β”‚           β”œβ”€β”€ com.kms.katalon.core.webservice
β”‚           └── com.kms.katalon.core.webui
└── 9.7.6
    └── resources
        β”œβ”€β”€ extentions
        β”‚   └── scripts
        └── source
            β”œβ”€β”€ com.kms.katalon.core
            └── com.kms.katalon.core.webui
  1. compare 2 directories under the versions to report the differences of 2 versions. The following zip file is an example of the output:
    10.3.0_11.2.1.zip (300.5 KB) The output includes
    a. directory difference summary
    differences.json (121.7 KB)
    b. souce code diff files.
    smart-wait.js (2.9 KB)

Using this tool, I can check how a pair of Katalon Studio source code versions differ.

When somebody reports β€œthe previous 10.3.0 worked fine, but the new version 11.2.1 works strange. Why?”, I can study how the source code versions differ. Sometimes (but not always) I can find the exact cause of the incident in the source code diff. For example, I used this tool in the following topic:

wow. this is great Mr @kazurayam
thanks for sharing. really appreciate it