Katalon Studio 8.0.0 much slower in opening and saving files

I have currently applied Katalon Studio in my project

I cannot continue my job and have to work on something else while awaiting your response

Operating System

Windows 10

Katalon Studio Version

8.0.0

Katalon Studio logs

.log.zip (4.1 KB)

Event Log is full of the following messages and every open of a file to edit or a save takes 4 or 5 secs and generates more of these messages. This never happened prior to release 8.0.0

CodeSelectRequestor: Could not proceed due to null declaring type for org.codehaus.groovy.ast.expr.ConstantExpression

1 Like

@duyluong @ThanhTo

How about trying to force “clean build” of the existing project.

  1. stop Katalon Studio
  2. delete <projectDir>/bin
  3. delete <projectDir>/Libs
  4. restart KS and open you project
  5. run test again
1 Like

No help, every file open or save action now takes 8 to 10 seconds.
I re-opened project with 7.8.2, and issue goes away.

1 Like

I found that the following UNRESOLVED issue of KS7.9.1 reported a StackTrace, which looks just the same as the log @danpoleary shared.

@duyluong
@ThanhTo

Any bug in Eclipse or Groovy plugin?

Just downloaded and tried 8.0.1, and it is worse now. Any ideas on what is causing file saves to take such a long time?

I have no idea. Chase Katalon Team, please.

@duyluong I have tried 8.0.0 and 8.0.1, and it gets progressively worse. We have multiple people with this issue and we are all now running with 7.8.2. When I have a chance, I will retest with the 7.9 versions to see if the issue exists in those.

Hi @danpoleary,

Sorry for your inconvenience in v7.9.1+. Can you share your project in private, it will help us to better investigating this issue.

Good morning @duyluong, We cannot share this project since is a secure environment application. I can give some stats.

We tried various java mem settings, and it had no impact on the file save/open issue.

The project consists of 547 Test Cases, and 90 Test Suites. We also have 43 BDD feature files with 10 step definition files.

Dan

@danpoleary

Thanks for your above information.

No help, every file open or save action now takes 8 to 10 seconds.

Does this issue happen only on Test Cases or another Test Artifact such as Object Repository, Test Suites, Test Data, etc?

Can you share a sample of test scripts if the issue happens on Test Cases and Keywords only?

Good morning @duyluong

It only happens in test cases. Not in suites or BDD step definitions.

Here is a sample testcase. When it opens, it takes 8 to 10 seconds. If I add a space in a comment line and save, it takes 8 to 10 seconds.

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import com.kms.katalon.core.checkpoint.Checkpoint as Checkpoint
import com.kms.katalon.core.checkpoint.CheckpointFactory as CheckpointFactory
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as MobileBuiltInKeywords
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling as FailureHandling
import com.kms.katalon.core.testcase.TestCase as TestCase
import com.kms.katalon.core.testcase.TestCaseFactory as TestCaseFactory
import com.kms.katalon.core.testdata.TestData as TestData
import com.kms.katalon.core.testdata.TestDataFactory as TestDataFactory
import com.kms.katalon.core.testobject.ObjectRepository as ObjectRepository
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WSBuiltInKeywords
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUiBuiltInKeywords
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable as GlobalVariable
import com.kms.katalon.core.configuration.RunConfiguration as RunConfiguration
import org.apache.commons.lang3.StringUtils as StringUtils
import org.openqa.selenium.Keys as Keys
import groovy.time.TimeCategory as TimeCategory
import com.kms.katalon.core.util.KeywordUtil as KeywordUtil
import org.openqa.selenium.By as By
import org.openqa.selenium.WebDriver as WebDriver
import org.openqa.selenium.WebElement as WebElement
import com.kms.katalon.core.webui.driver.DriverFactory as DriverFactory
import groovy.time.TimeCategory
import com.katalon.cdp.CdpUtils
import com.katalon.utils.OsUtils

def curGlobalStatus = CustomKeywords.'cannabisCommon.ModifyCSVFile.GetkeyValue'(GlobalVariable.currentTestSuiteId)
def Date today = new Date()


	todaysMonth = today.format('MM')
	todaysYear = today.format('YYYY')
	todaysDay = today.format('dd')
	todaysHour = today.format('hh')
	todaysMin = today.format('mm')

if (((GlobalVariable.currentTestCaseId == curGlobalStatus) || (curGlobalStatus == 'Success')) || (curGlobalStatus == '')) {

	def testFiles = RunConfiguration.getProjectDir().replaceAll('/', '\\\\') + '\\TestFiles'

	
	String seniorPersonInCharge = testFiles + '\\PhotoID - SeniorpersonInCharge.txt'
	String licenceHolder = testFiles + '\\PhotoID - Licenceholder.txt'
	String seniorPersonInChargeDocument = testFiles + '\\SeniorpersonInCharge.txt'
	
	
	if (row_number > 0) {
		// write current row number to globalvariable
		// This is then used in after test case to flag the testcase that errored on the current row
		GlobalVariable.currentRowNumber = row_number
	}

	String curAccountID = GlobalVariable.PortalAccountId

	if (RP != '')
		curAccountID = RP

	//	def configuredAccounts = CustomKeywords.'cannabisCommon.ManageLocalConfig.GetPortalAndCRMAccounts'()
	//	String alternate1 = ""
	//	String alternate2 = ""
	//String altResponsible = ""
	if (dataFile == '0') {
		def configuredAccounts = CustomKeywords.'cannabisCommon.ManageLocalConfig.GetPortalAndCRMAccounts'()
		if (configuredAccounts[5] == "") {
			// Throw error that alternates 1 and 2 are missing
		} else {

			//			alternate1 = configuredAccounts[4]
			//			alternate2 = configuredAccounts[5]
			AltRP = configuredAccounts[5]

		}
	}
	if (licAppStatus != 'Success') {

		WebUI.click(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Index/a_Licence Ownership'),FailureHandling.STOP_ON_FAILURE)

		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)
	}

	if (ownership == "I"){

		WebUI.click(findTestObject('Portal/Licence Applications/Page_Licence Application - Licence/input_LicenceOwnershipType_Individual'),FailureHandling.STOP_ON_FAILURE)

		//WS.delay(2)
		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)
		//		WebUI.setText(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Licence/input_CRABusinessNumber'), '123456782',FailureHandling.STOP_ON_FAILURE)
	} else if (ownership == "C"){ // Its a corporation
		WebUI.click(findTestObject('Portal/Licence Applications/Page_Licence Application - Licence/input_LicenceOwnershipType - Corporation'),FailureHandling.STOP_ON_FAILURE)

		'Get corporate profile guid from csv'
		String guid = ''
		if (dataFile == '0'){
			guid = CustomKeywords.'cannabisCommon.ModifyCSVFile.GetkeyValue'('Last_Corporate_GUID')
		} else {
			guid = corporateGuid
		}

		WS.delay(2)
		WebUI.selectOptionByValue(findTestObject('Portal/Licence Applications/Page_Licence Applications - Industrial Hemp/select_Corporation name'), guid, true,FailureHandling.STOP_ON_FAILURE)

	}
	
	
	WebUI.click(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/a_Edit - SeniorPersonInCharge'),FailureHandling.STOP_ON_FAILURE)

	CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)

	if (runWCAG == 1) {
		String url = WebUI.getUrl()
		// remove https://ctls-sscdl.uat.hc-sc.gc.ca/  from the url and replace '/' with '-' and remove trailing slash value  so QA/LicenceApplication/SiteDetails/b3b1af84-f8be-eb11-8145-005056812cba
		// become QA-LicenceApplication-SiteDetails
		// todaysYear + '-' + todaysMonth + '-' + todaysDay
		def (host, port) = CdpUtils.getServiceEndpoint()
		OsUtils.runCommand("lighthouse ${url} --hostname ${host} --port ${port} --preset=desktop --output-path=..\\Katalon_Local_Config\\WCAG\\CDL-New-Ownership-Popup-${todaysYear}-${todaysMonth}-${todaysDay}-${todaysHour}${todaysMin}.html --no-enable-error-reporting", null, null)
	}

	WebUI.setText(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Licence/input_ResponsiblePersonAccountId'), curAccountID,FailureHandling.STOP_ON_FAILURE)

	WebUI.click(findTestObject('Portal/Licence Applications/Page_Licence Application - Licence/button_Validate'),FailureHandling.STOP_ON_FAILURE)

	CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)


	WebUI.click(findTestObject('Portal/Licence Applications/Page_Licence Application - Licence/button_Save  Close'),FailureHandling.STOP_ON_FAILURE)

	//WS.delay(2)
	CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)
//	if (AltRP != '') {
//		// add alternate responsible person
//		WebUI.click(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Licence/a_Edit -AltRP'),FailureHandling.STOP_ON_FAILURE)
//
//		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)
//
//		WebUI.setText(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Licence/input_AltResponsiblePersonAccountId'), AltRP,FailureHandling.STOP_ON_FAILURE)
//		WS.delay(2)
//		WebUI.click(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Licence/button_Validate - AltRP'),FailureHandling.STOP_ON_FAILURE)
//		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)
//
//
//		WebUI.click(findTestObject('Object Repository/Portal/Licence Applications/Page_Licence Application - Licence/button_Save Close - AltRP'),FailureHandling.STOP_ON_FAILURE)
//
//		//WS.delay(2)
//		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)
//
//	}
	if (ownership == "I"){
		WebUI.sendKeys(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/input_PhotoID-SeniorPersonInChargeSecurityDoc'), seniorPersonInChargeDocument)
		WebUI.click(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/button_Upload - 2'))
		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(2)

		WebUI.sendKeys(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/input_PhotoID-SeniorPersonInCharge'), seniorPersonInCharge)
		WebUI.click(findTestObject('Portal/License Applications/Page_Licence Application - Licence/button_Upload'))
		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(2)

		WebUI.sendKeys(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/input_PhotoID-LicenceHolder'), licenceHolder)

		//WS.delay(2)

		WebUI.click(findTestObject('Portal/License Applications/Page_Licence Application - Licence/button_Upload - 3'))
		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(2)
	} else if (ownership == "C"){ // Its a corporation
		WebUI.sendKeys(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/input_PhotoID-SeniorPersonInChargeSecurityDoc'), seniorPersonInChargeDocument)
		WebUI.click(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/button_Upload - 2'))
		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(2)

		WebUI.sendKeys(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/input_PhotoID-SeniorPersonInCharge'), seniorPersonInCharge)
		WebUI.click(findTestObject('Portal/License Applications/Page_Licence Application - Licence/button_Upload'))
		CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(2)


	}
	WebUI.click(findTestObject('Object Repository/Portal/License Applications/Page_Licence Application - Licence/button_Save  Next'),FailureHandling.STOP_ON_FAILURE)

	//WS.delay(2)
	CustomKeywords.'utils.waitForReadyState.waitForJS_Complete_Ready'(1)

	return 'Success'
} else {
	KeywordUtil.markWarning('Force Skipped')
}

Hi all,

Apologies if this is not related but the sample BDD Katalon project (calculator), goes to “Not Responding” on every file change and save for about 5 seconds. - Version 8.0.1

This is the exact same behaviour, but was not happening to me on BDD groovy step definition (.groovy) but only on test cases (.groovy). Maybe it is related to what we are using within the groovy files (An import/method call)?

@danpoleary

Please tell us where (in which folder) you installed Katalon Studio?

Somewhere under the C:\Users\yourOsUserName? Or somewhere under the root C:\ ? (such as C:\Program Files(x86)) ?


@danpoleary

In your Test Case script I noticed the following lines:

These must come from some Plugins.

Are you sure you have those Plugins installed in you current version of Katalon Studio?

@danpoleary

Just try the following, please.

Stop your Katalon Studio, and in the command line, do

$ cd %KATALON_STUDIO_INSTALLED_FOLDER%
$ eclipse.exe -clean

or like this

I am on Mac now, and I do not have Windows with Katalon Studio, so I am not sure what exactly the name of Katalon Studio binary on Windows is. Please check your environment.

This will force Eclipse inside Katalon Studio to initialise its various internal caches safely and let it start clean. See java - How to run eclipse in clean mode? what happens if we do so? - Stack Overflow for info.

Once Katalon Studio started, try working on your problematic project. Any difference?


Also you may try installing Katalon Studio v8.0.x into a new folder.

I mean, do not do “in place update” in UI as described in the doc.

Rather download the zip of v8.0.x manually, and unzip it into a new folder.

@duyluong
@ThanhTo

As you may be aware of, the Eclipse IDE’s README document writes;

Platform - Install/Update

Manually installing features and plug-ins on a FAT file system (Windows only)

When features and plug-ins are manually installed on top of an Eclipse-based product install located on a FAT file system that has already been run at least once, the product must be explicitly restarted with -clean. That is,

eclipse.exe -clean

I could find this document on my Mac at file://<eclipse installed directory>/eclipse/java-2021-03/Eclipse.app/Contents/Eclipse/readme/readme_eclipse.html


Cleaning the Eclipse’ internal cache with -clean option sometimes solve subtle problems which occur when you have removed or changed some externally installed plugins to Eclipse and other Eclipse’ settings.

I suppose the Content Assist feature of Java/Groovy Editor UI, which is invoked by Ctrl+Space key stroke, is dependent on the cache of classes. Any reference to a cached class, which was contained in a plugin and now is missing as the plugin has been removed, may cause failure & recovery (so called “the reconcile process”). The “reconciliation” would make the Editor slow.

I guess, upgrading the product package (e.g, KS 7.8.x → 8.0.0) possibly includes some changes of bundled plugin. Most of the users would not be affected by the change as they are likely not using the problem plugin, but some heavy users who are dependent on the problem plugin may encounter difficulties.

Katalon Team should advise users (on Windows only) that they should do -clean once after upgrading Katalon Studio if they update Katalon Studio in-place.

If users install a new version of Katalon Studio into a new folder while leaving the older one, and switch to the new installation, they would not need -clean as the new installation is already clean.

I personally never do in-place update of Eclipse (=Katalon Studio) on Windows, I always create new installation for each versions; because I am worried about difficulties that tends to occur after in-place update.

It would be a good idea if you bundle another Katalon Studio launcher icon with -clean option specified in the distributable. Users will just double click it to launch Katalon Studio with -clean option after upgrading the version.

Note that it takes far longer seconds to launch Eclipse with -clean, so that we would not like it usually.

Hi @kazurayam,

I tried both an in-place update and a fresh install/unzip. Everything is installed under C:\development\apps.

I have tried -clean.

The two imports are for custom keywords, and are not from plugins.

None of these have an impact on my issue.

I am attempting to write a testcase which I will add imports one by one to see if one of them is causing the issue. I will then try adding method calls one by one.

Dan

@kazurayam I also noticed something different, if I copy a testcase that has a save issue to a new testcase, then the save on the new one is instant. The only difference is the new testcase is not part of any testsuites. I am now creating a bunch of fake testsuites that include that new testcase to see if that starts to slowdown that testcase save.

Results: Being part of a number of testsuites did not slow down the saves.