使用 Katalon 和 Chrome 无头模式的屏幕截图
Screenshot with Katalon and Chrome headless mode
我正在使用以下代码截取我的 Katalon Studio 脚本中的警告和错误消息的屏幕截图:
import ru.yandex.qatools.ashot.AShot
import ru.yandex.qatools.ashot.Screenshot
import ru.yandex.qatools.ashot.coordinates.*
import ru.yandex.qatools.ashot.cropper.*
public class ScreenshotHelper {
public void takeWebElementScreenshot(TestObject object) {
WebElement element = WebUiCommonHelper.findWebElement(object, 20)
WebDriver driver = DriverFactory.getWebDriver();
String fileName = new SimpleDateFormat("yyyyMMddHHmmSSS").format(new Date())
Screenshot screenshot = new AShot().takeScreenshot(driver, element)
ImageIO.write(screenshot.getImage(),'PNG', new File(System.getProperty("user.dir")+"/ErrorScreenshots/ElementScreenshot"+"_"+fileName+".png"))
}
}
此方法是从相同 class 的另一个方法调用的:
public void catchNotyMessage(){
TestObject noty_warning = WebUI.modifyObjectProperty(findTestObject("DUMMY"), 'css', 'equals', 'div.noty_type_warning', true)
TestObject noty_error = WebUI.modifyObjectProperty(findTestObject("DUMMY"), 'css', 'equals', 'div.noty_type_error', true)
if (WebUI.verifyElementPresent(noty_error, 1, FailureHandling.OPTIONAL)){
this.takeWebElementScreenshot(noty_error)
}
else if (WebUI.verifyElementPresent(noty_warning, 1, FailureHandling.OPTIONAL)){
this.takeWebElementScreenshot(noty_warning)
}
}
它工作正常,截图是在正常模式下使用 Katalon 时截取的。
但是,当我 运行 无头模式下的脚本时,我收到以下警告:
WARNING com.kms.katalon.core.webui.exception.WebElementNotFoundException: Web element with id: 'Object Repository/DUMMY' located by 'By.cssSelector: div.noty_type_error' not found
即使该元素应该存在。测试失败并显示 java.lang.NullPointerException
.
是因为无头执行?我该如何解决这个问题?
您必须将参数设置为无头 chrome:
看了https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html, java.io.FileNotFoundException: the system cannot find the file specified, and Java "user.dir" property - what exactly does it mean?,终于明白了
问题是在无头模式下通过命令行执行测试时System.getProperty("user.dir")
发生了变化。所以,这段代码有效:
public void takeWebElementScreenshot(TestObject object) {
WebElement element = WebUiCommonHelper.findWebElement(object, 20)
WebDriver driver = DriverFactory.getWebDriver();
String fileName = new SimpleDateFormat("yyyyMMddHHmmSSS").format(new Date())
Screenshot screenshot = new AShot().takeScreenshot(driver, element)
try {
if (DriverFactory.getExecutedBrowser().getName()=='HEADLESS_DRIVER'){
ImageIO.write(screenshot.getImage(),'PNG', new File("C:/Users/path_to_working_directory/ErrorScreenshots/HeadlessElementScreenshot"+"_"+fileName+".png"))
} else {
ImageIO.write(screenshot.getImage(),'PNG', new File(System.getProperty("user.dir")+"/ErrorScreenshots/ElementScreenshot"+"_"+fileName+".png"))
}
} catch (Exception e) {
e.printStackTrace()
}
}
我正在使用以下代码截取我的 Katalon Studio 脚本中的警告和错误消息的屏幕截图:
import ru.yandex.qatools.ashot.AShot
import ru.yandex.qatools.ashot.Screenshot
import ru.yandex.qatools.ashot.coordinates.*
import ru.yandex.qatools.ashot.cropper.*
public class ScreenshotHelper {
public void takeWebElementScreenshot(TestObject object) {
WebElement element = WebUiCommonHelper.findWebElement(object, 20)
WebDriver driver = DriverFactory.getWebDriver();
String fileName = new SimpleDateFormat("yyyyMMddHHmmSSS").format(new Date())
Screenshot screenshot = new AShot().takeScreenshot(driver, element)
ImageIO.write(screenshot.getImage(),'PNG', new File(System.getProperty("user.dir")+"/ErrorScreenshots/ElementScreenshot"+"_"+fileName+".png"))
}
}
此方法是从相同 class 的另一个方法调用的:
public void catchNotyMessage(){
TestObject noty_warning = WebUI.modifyObjectProperty(findTestObject("DUMMY"), 'css', 'equals', 'div.noty_type_warning', true)
TestObject noty_error = WebUI.modifyObjectProperty(findTestObject("DUMMY"), 'css', 'equals', 'div.noty_type_error', true)
if (WebUI.verifyElementPresent(noty_error, 1, FailureHandling.OPTIONAL)){
this.takeWebElementScreenshot(noty_error)
}
else if (WebUI.verifyElementPresent(noty_warning, 1, FailureHandling.OPTIONAL)){
this.takeWebElementScreenshot(noty_warning)
}
}
它工作正常,截图是在正常模式下使用 Katalon 时截取的。
但是,当我 运行 无头模式下的脚本时,我收到以下警告:
WARNING com.kms.katalon.core.webui.exception.WebElementNotFoundException: Web element with id: 'Object Repository/DUMMY' located by 'By.cssSelector: div.noty_type_error' not found
即使该元素应该存在。测试失败并显示 java.lang.NullPointerException
.
是因为无头执行?我该如何解决这个问题?
您必须将参数设置为无头 chrome:
看了https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html, java.io.FileNotFoundException: the system cannot find the file specified,
问题是在无头模式下通过命令行执行测试时System.getProperty("user.dir")
发生了变化。所以,这段代码有效:
public void takeWebElementScreenshot(TestObject object) {
WebElement element = WebUiCommonHelper.findWebElement(object, 20)
WebDriver driver = DriverFactory.getWebDriver();
String fileName = new SimpleDateFormat("yyyyMMddHHmmSSS").format(new Date())
Screenshot screenshot = new AShot().takeScreenshot(driver, element)
try {
if (DriverFactory.getExecutedBrowser().getName()=='HEADLESS_DRIVER'){
ImageIO.write(screenshot.getImage(),'PNG', new File("C:/Users/path_to_working_directory/ErrorScreenshots/HeadlessElementScreenshot"+"_"+fileName+".png"))
} else {
ImageIO.write(screenshot.getImage(),'PNG', new File(System.getProperty("user.dir")+"/ErrorScreenshots/ElementScreenshot"+"_"+fileName+".png"))
}
} catch (Exception e) {
e.printStackTrace()
}
}