Created Keyword for screenshot an element keeps failing

I keep getting this error:
Test Cases/Track
canvas compare sandbox FAILED because (of) java.lang.RuntimeException:
org.openqa.selenium.WebDriverException: unknown error: $ is not defined

Driver info:
com.kms.katalon.selenium.driver.CChromeDriver

Capabilities
{acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled:
false, browserConnectionEnabled: false, browserName: chrome, chrome:
{chromedriverVersion: 2.35.528161 (5b82f2d2aae0ca…, userDataDir:
C:\Users\IGEN474\AppData\Lo…}, cssSelectorsEnabled: true, databaseEnabled:
false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true,
locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents:
true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP,
platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot:
true, takesScreenshot: true, unexpectedAlertBehaviour: ,
unhandledPromptBehavior: , version: 67.0.3396.99, webStorageEnabled: true}

com.at.util.ScreenshotHelper.takeWebElementScreenshot:46

com.at.util.ScreenshotHelper.invokeMethod:0

Test Cases/Track
canvas compare sandbox.run:40

Here is my code:

public class
ScreenshotHelper {

@Keyword

public void takeWebElementScreenshot(TestObject
Object) {

WebElement element =
WebUiCommonHelper.findWebElement(Object,20)

WebDriver driver = DriverFactory.getWebDriver();

Screenshot screenshot = new
AShot().takeScreenshot(driver,element);

ImageIO.write(screenshot.getImage(),“PNG”,new
File(“C:/Users/IGEN474/Desktop/CADX/TestingScreenShot/screenshot.PNG”))

}

}

unknown error: $ is not defined

This message suggest you have ‘$’ somewhere in your test artifacts (Test Cases, Test Objects, Custom Keywords) and it is the root cause of your problem.

Here you attached the code of your Keyword, which does not have $ inside. OK.

Then you need to look at other artifacts. Please attach the codes of your Test Case, and the screenshot of the definition of your Test Object. I have a doubt about the locator of your Test Object.

2 Likes

I was able to at least get past that error. Now it is failing to invoke a method.

Test script:

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 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 java.awt.image.BufferedImage as BufferedImage

import javax.imageio.ImageIO as ImageIO

import org.openqa.selenium.WebDriver as WebDriver

import org.openqa.selenium.WebElement as WebElement

import com.kms.katalon.core.webui.common.WebUiCommonHelper as WebUiCommonHelper

import com.kms.katalon.core.webui.driver.DriverFactory as DriverFactory

import java.io.IOException as IOException

import org.frontendtest.components.ImageComparison as ImageComparison

import java.awt.Image as Image

import java.awt.Toolkit as Toolkit

import java.awt.image.PixelGrabber as PixelGrabber

import com.kms.katalon.core.logging.KeywordLogger as KeywordLogger

WebUI.callTestCase(findTestCase(‘Positive Test Cases/Upload Movement Plan’), [:], FailureHandling.STOP_ON_FAILURE)

WebUI.maximizeWindow()

WebUI.delay(10)

CustomKeywords.‘com.at.util.ScreenshotHelper.takeWebElementScreenshot’(findTestObject(‘Page_Movement Planner/canvas_trackMapBody’))

WebUI.closeBrowser()

Keyword definition that is failing on WebCoordProvider

public class ScreenshotHelper {

@Keyword

public void takeWebElementScreenshot(TestObject Object) {

WebElement element = WebUiCommonHelper.findWebElement(Object,20)

WebDriver driver = DriverFactory.getWebDriver();

// Screenshot screenshot = new AShot().takeScreenshot(driver,element)

Screenshot screenshot = new AShot().coordsProvider(new WebDriverCoordsProvider(driver,element))

ImageIO.write(screenshot.getImage(),“PNG”,new File(“C:/Users/IGEN474/Desktop/CADX/TestingScreenShot/screenshot.PNG”))

}

}

I get this error:

Test Cases/Track canvas compare sandbox FAILED because (of) groovy.lang.GroovyRuntimeException: Could not find matching constructor for: ru.yandex.qatools.ashot.coordinates.WebDriverCoordsProvider(com.kms.katalon.selenium.driver.CChromeDriver, org.openqa.selenium.remote.RemoteWebElement)

com.at.util.ScreenshotHelper.takeWebElementScreenshot:48

com.at.util.ScreenshotHelper.invokeMethod:0

Test Cases/Track canvas compare sandbox.run:40

The error message is saying:

Could not find matching constructor for: ru.yandex.qatools.ashot.coordinates.WebDriverCoordsProvider(com.kms.katalon.selenium.driver.CChromeDriver, org.openqa.selenium.remote.RemoteWebElement)

I found the source of ru.yandex.qatools.ashot.coordinates.WebDriverCoordsProvider here:

Ah. In fact there isn’t the constructor with that signature.

Now I would ask you. How come you wrote this?

new WebDriverCoordsProvider(driver,element)

Are you sure this code is right? — It can’t be

1 Like

While researching my previous problem I found others that had used the Ashot jar and that was what they had done with some success.

Hi @kazurayam
I’m facing a similar issue:

Please see my code below:
ScreenshotHelper keyword :

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 internal.GlobalVariable
import org.openqa.selenium.WebElement as WebElement
import org.openqa.selenium.By.ByXPath as ByXPath
import org.openqa.selenium.By.ByCssSelector as ByCssSelector
import org.openqa.selenium.WebDriver as WebDriver
import org.openqa.selenium.By as By
import org.openqa.selenium.interactions.Actions as Actions
import com.kms.katalon.core.webui.driver.DriverFactory as DriverFactory
import java.util.ArrayList
import java.util.Collections as Collections
import com.kms.katalon.core.util.KeywordUtil as KeywordUtil
import com.kms.katalon.core.webui.common.WebUiCommonHelper

import ru.yandex.qatools.ashot.AShot
import ru.yandex.qatools.ashot.Screenshot;
import ru.yandex.qatools.ashot.coordinates.WebDriverCoordsProvider
import ru.yandex.qatools.ashot.shooting.ShootingStrategies
import ru.yandex.qatools.ashot.comparison.ImageDiff
import ru.yandex.qatools.ashot.comparison.ImageDiffer

import javax.imageio.ImageIO

public class ScreenshotHelper {

@Keyword
public void takeWebElementcreenshot(TestObject object) {
	WebElement element = WebUiCommonHelper.findWebElement(object,20)
	WebDriver driver = DriverFactory.getWebDriver();
	Screenshot screenshot = new AShot().takeScreenshot(driver,element);
	ImageIO.write(screenshot.getImage(),"PNG", new File("C://Users//qwilt//Katalon Studio//OpsDashboardWebTesting//Screenshots//ElementScreenshot.PNG"))
}

}

Test Case:
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.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
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.testdata.TestData as TestData
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable as GlobalVariable
import org.openqa.selenium.Keys as Keys
import com.qwilt.OpsKeywords.ScreenshotHelper as ScreenshotHelper
WebUI.openBrowser(GlobalVariable.urlTransparent)

WebUI.delay(2)

CustomKeywords.‘com.qwilt.OpsKeywords.ScreenshotHelper.takeWebElementcreenshot’(findTestObject(‘ImageTarget’))

WebUI.delay(5)

WebUI.closeBrowser()

The locator of the ImageTarget is: [class^=‘TimezoneBtn’]

Please advise.

I saw your codes, but do not see what’s your problem. Please describe it. Any error message?

This is the error I got:

canvas compare sandbox FAILED because (of) java.lang.RuntimeException:
org.openqa.selenium.WebDriverException: unknown error: $ is not defined

Eventually, the following line has solved the issue:

Screenshot screenshot = new AShot().coordsProvider(new WebDriverCoordsProvider()).takeScreenshot(driver,element);

instead of : Screenshot screenshot = new AShot().takeScreenshot(driver,element);