Call custom keyword from a custom keyword

I have 2 custom keywords, located in the same package. I try to call one custom keyword from the other one. This code isn’t working in this case:
CustomKeywords.'mypack.myclass.mymethod'()

Please see this link.

@Sudheer_D_J : I try this, but got error message.

Keyword, which should be called:

package uploadFile

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.annotation.Keyword
import com.kms.katalon.core.checkpoint.Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling
import com.kms.katalon.core.testcase.TestCase
import com.kms.katalon.core.testdata.TestData
import com.kms.katalon.core.testobject.TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import java.awt.Robot
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
import java.awt.event.KeyEvent

import com.kms.katalon.core.annotation.Keyword
import com.kms.katalon.core.testobject.TestObject
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable

class upload2Files {
	@Keyword
	def upload(TestObject to, String filePath , String file , String file2) {
		WebUI.click(to)
		StringSelection ss = new StringSelection("\""+filePath+"\" " +"\""+ file +"\" "+ file2 );
		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
		Robot robot = new Robot();
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
		robot.keyPress(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_CONTROL)
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
	}
} 

Other keyword, where I try to call it:
(new uploadFile.upload2Files()).upload(findTestObject('Object Repository/validateFile/input_originalFile'), (d_directory.toString() + '\\') + detachedTXT1, (d_directory.toString() + '\\') + detachedTXT2)

Error message:

org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: uploadFile.upload2Files.upload() is applicable for argument types: (com.kms.katalon.core.testobject.TestObject, java.lang.String, java.lang.String) values

Sorry i dont about the error. i am thinking like it is an argument issue. But calling one keyword into other keyword this is the way.

Someone can help you

hello,

are those keywords under in same class?

hello,

this will works fine

TEST

def res = CustomKeywords.'com.two.keyword.Keyword1.getString'("Katalon")
println res

KEYWORDS

import com.two.keyword.Keyword2
public class Keyword1 {
	
	@Keyword
	public String getString(String test){
		
		Keyword2 key2 = new Keyword2()
		String res = key2.returnFirstKeywordString(test)
		return res
	}
}

public class Keyword2 {
	
	@Keyword
	public String returnFirstKeywordString(String test2){
		
		return "this is returned from keyword 2 "+test2
	}
}

RESULT
this is returned from keyword 2 Katalon

@Timo_Kuisma : I got the same error when I try to execute it. Could you please share a sample project, that is working on your environment?

hello,

did you added import as i did
import com.two.keyword.Keyword2
and did you declared new object from class 2 in class 1 like
Keyword2 key2 = new Keyword2()

show your keywords, i can check

@Timo_Kuisma : So, here are my keywords:

Screenshot_14_katalon

upload2Files.groovy:

package uploadFile

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.annotation.Keyword
import com.kms.katalon.core.checkpoint.Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling
import com.kms.katalon.core.testcase.TestCase
import com.kms.katalon.core.testdata.TestData
import com.kms.katalon.core.testobject.TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import java.awt.Robot
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
import java.awt.event.KeyEvent

import com.kms.katalon.core.annotation.Keyword
import com.kms.katalon.core.testobject.TestObject
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable

class upload2Files {
	@Keyword
	def upload(TestObject to, String filePath , String file , String file2) {
		WebUI.click(to)
		StringSelection ss = new StringSelection("\""+filePath+"\" " +"\""+ file +"\" "+ file2 );
		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
		Robot robot = new Robot();
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
		robot.keyPress(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_CONTROL)
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
	}
}

Method call in fileupload.groovy:

import uploadFile.upload2Files

in method:
upload2Files up = new upload2Files()
up.upload(findTestObject(‘Object Repository/validateFile/input_originalFile’), d_directory.toString(), detachedTXT1, ,detachedTXT2)

Error message:

org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: uploadFile.fileupload.upload2Files() is applicable for argument types: (uploadFile.upload2Files) values: [uploadFile.upload2Files@28d79cba]

There is a space between detachedTXT1 and detachedTXT2.

Thanks, I edited it, but error comes in first line from this 3.

Try changing the 3 lines to this:

upload2Files.upload(findTestObject(‘Object Repository/validateFile/input_originalFile’), d_directory.toString(), detachedTXT1, detachedTXT2)

I am no programming expert, but I think you are calling a constructor method that has not been defined when you invoke upload2Files up = new upload2Files().

That was my first try, but it doesn’t work also, I got same error message. A sample project with this construct would be really helpful.

hi,

new instance is not created correct
groovy.lang.MissingMethodException: No signature of method: uploadFile
or
are these really files or String objects?
String file , String file2
debug your arguments
System.out.println("DEBUG "+filePath+ " " +file+ " " +file2)

Hi,
This works

package test

import com.kms.katalon.core.annotation.Keyword

public class KeywordA {
	
	@Keyword
	def methodAKeywordA(String something){
		println "I'm in the KeywordA"
	}
}
package test

import com.kms.katalon.core.annotation.Keyword

public class KeywordB {
	
	KeywordA kA = new KeywordA()
	
	@Keyword
	def methodB(){
		kA.methodAKeywordA("")
	}
}

Your problem is on arguments. Please share your full error message. You should have

org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: uploadFile.fileupload.upload2Files() is applicable for argument types: (uploadFile.upload2Files) values: [uploadFile.upload2Files@28d79cba]
Possible solutions: […]

1 Like

@HeleneB : Full exception:
Reason:
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: uploadFile.fileupload.upload2Files() is applicable for argument types: (uploadFile.upload2Files) values: [uploadFile.upload2Files@782168b7]
at com.kms.katalon.core.main.CustomKeywordDelegatingMetaClass.invokeStaticMethod(CustomKeywordDelegatingMetaClass.java:50)
at DSS_validateFile.run(DSS_validateFile:62)
at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:337)
at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:328)
at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:307)
at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:299)
at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:233)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:114)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:105)
at com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(Unknown Source)
at TempTestCase1561032780817.run(TempTestCase1561032780817.groovy:21)
Caused by: groovy.lang.MissingMethodException: No signature of method: uploadFile.fileupload.upload2Files() is applicable for argument types: (uploadFile.upload2Files) values: [uploadFile.upload2Files@782168b7]
at uploadFile.fileupload.listFilesAndFilesSubDirectories(fileupload.groovy:171)
… 13 more

@Timo_Kuisma :

Method call:

Method:

As I see parameter lists are correct and type of variables too.
String parts = detachedTXT.split(“__”);
String detachedTXT1 = parts[0];
String detachedTXT2 = parts[1];

hi,

usually this error mean that types are not correct or some type not defined at all
No signature of method: uploadFile.fileupload.upload2Files()

And this method ?

yes,

check your argument types and how those are used in methods