Katalon无法存储元素列表并执行断言问题求助
Katalon元素抓取与货币符号校验问题修复
问题根源分析
报错的核心原因有三个:
- 自定义Keyword中错误地将
ArrayList对象当作方法调用(list(price)),应该直接传入WebElement对象给WebUI.getText() WebUI.verifyElementText()的参数使用错误,该方法接收的是WebElement和预期文本,且会直接抛出断言失败异常,不能用在if判断中- 切换货币后页面元素已更新,但仍使用之前抓取的旧元素列表,导致元素状态过时
修复方案
1. 修正自定义Keyword代码
将错误的方法调用和断言逻辑调整为正确的写法,改用contains判断货币符号,并输出日志:
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI import org.openqa.selenium.WebElement def checkElements(List<WebElement> list, String currency) { for (WebElement price : list) { String priceText = WebUI.getText(price) if (priceText.contains(currency)) { println "Price element contains correct currency symbol: ${currency}" } else { println "ERROR: This item doesn't have the correct currency symbol. Text found: ${priceText}" // 若要中断测试可添加断言失败 // WebUI.verifyTrue(priceText.contains(currency), "Currency symbol mismatch") } } }
2. 调整主测试脚本
切换货币后重新抓取元素列表,确保使用最新的页面元素:
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.WebElement import com.kms.katalon.core.webui.driver.DriverFactory import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI WebUI.openBrowser('https://automationteststore.com/') WebUI.maximizeWindow() WebDriver driver = DriverFactory.getWebDriver() // 定义XPATH为变量,方便复用 def priceXpath = "//div[@class='price']/div[@class='pricenew' or @class='priceold' or @class='oneprice']" // 初始美元校验 List<WebElement> listPrices = driver.findElements(By.xpath(priceXpath)) CustomKeywords.'checkElement.checkElements'(listPrices, '$') // 切换为英镑并重新抓取元素校验 WebUI.enhancedClick(findTestObject('Home_Page_Elements/dropdownToggle')) WebUI.enhancedClick(findTestObject('Home_Page_Elements/dropdownPound')) listPrices = driver.findElements(By.xpath(priceXpath)) CustomKeywords.'checkElement.checkElements'(listPrices, '£') // 切换为欧元并重新抓取元素校验 WebUI.enhancedClick(findTestObject('Home_Page_Elements/dropdownToggle')) WebUI.enhancedClick(findTestObject('Home_Page_Elements/dropdownEuro')) listPrices = driver.findElements(By.xpath(priceXpath)) CustomKeywords.'checkElement.checkElements'(listPrices, '€') // 切换回美元并重新抓取元素校验 WebUI.enhancedClick(findTestObject('Home_Page_Elements/dropdownToggle')) WebUI.enhancedClick(findTestObject('Home_Page_Elements/dropdownDollar')) listPrices = driver.findElements(By.xpath(priceXpath)) CustomKeywords.'checkElement.checkElements'(listPrices, '$') WebUI.closeBrowser()
3. 可选:改用Katalon内置方法抓取元素
如果不想直接使用Selenium的findElements,可以创建一个Test Object,将XPATH设置为上述的合并表达式,然后用WebUI.findWebElements方法抓取:
// 替换原有的driver.findElements行 List<WebElement> listPrices = WebUI.findWebElements(findTestObject('TestObjects/AllPriceElements'), 10)
内容的提问来源于stack exchange,提问作者Joao Victor
相关产品推荐
相关产品推荐

