Katalon Studio处理table并获取单元格数值
写在前面
博主最近在使用Katalon Studio实施UI自动化测试。
在做账务检查脚本开发的时候,需要获取一些交易明细中的前后数值进行核算对比,验证数据的准确性。
在获取数据的时候,发现需要定位table中元素,并且获取table中指定单元格的数据。如何获取呢?
把问题抽象化:
1.所有的html table不外乎是由 table 元素以及一个或多个 tr、th 或 td 元素组成;
2.我们可以将行和列参数化,通过传入行和列的值定位单元格获取返回的text信息;
这样我们可以根据输入参数获取任意一个cell的数据了。
需要获取数据的前端界面如下图所示(该系统使用的是IE8浏览器):
HTML代码截图:
解决问题
处理问题思路:
1.首先定位到表格table;
2.然后再根据表格中的tag标签,获取该表格的总行数;
3.再通过行数和表格中的tag标签获取列数;
4.通过几行几列来获取单元格的数据;
根据以上解决问题的思路,去实现需求。好在Katalon Studio本身封装了关键字,我们可以通过关键字进行获取数据;
Katalon Studio定义的关键字:
package com.example import groovy.json.JsonSlurper import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements import org.openqa.selenium.By import org.openqa.selenium.WebElement import com.kms.katalon.core.annotation.Keyword import com.kms.katalon.core.model.FailureHandling import com.kms.katalon.core.testobject.TestObject import com.kms.katalon.core.testobject.TestObjectProperty import com.kms.katalon.core.testobject.ResponseObject import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords public class WebUICustomKeywords { /** * Get all rows of HTML table 获取HTML表格的总行数 * @param table Katalon test object represent for HTML table 参数1:HTML表格 * @param outerTagName outer tag name of TR tag, usually is TBODY 参数2:HTML表格下面的tag标签,一般为tbody * @return All rows inside HTML table 返回HTML表格行的所有行数 */ @Keyword def ListgetHtmlTableRows(TestObject table, String outerTagName) { WebElement mailList = WebUiBuiltInKeywords.findWebElement(table) List selectedRows = mailList.findElements(By.xpath("./" + outerTagName + "/tr")) return selectedRows } /** * Get all cells of HTML table row 获取HTML表格行的所有单元格 * @param row a WebElement instance represent for HTML table row 参数1:HTML表格的总行数 * @param tagName HTML column tag name, usually is TD/TH 参数2:HTML表格下面的tag标签,一般为:TD或TH * @return All cells inside HTML table row 返回HTML表格行的所有单元格 */ @Keyword def List getHtmlTableColumns(WebElement row, String tagName) { List selectedColumns = row.findElements(By.tagName(tagName)) return selectedColumns } }
Manual试图使用方法如下:Sprint脚本试图代码:
table = findTestObject('Page_Account/table_flexlist') println(table) TableRows=CustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableRows'(findTestObject('Page_Account/table_flexlist'),'tbody') TableRows_All = TableRows.size() println (TableRows_All) TableColumns = CustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td') Account = TableColumns[9].text println (Account)
执行日志:
08-30-2018 08:23:02 下午 - [START] - Start action : Statement - table = com.kms.katalon.core.testobject.ObjectRepository.findTestObject(Page_Account/table_flexlist) 08-30-2018 08:23:02 下午 - [INFO] - Finding Test Object with id 'Object Repository/Page_Account/table_flexlist' 08-30-2018 08:23:02 下午 - [END] - End action : Statement - table = com.kms.katalon.core.testobject.ObjectRepository.findTestObject(Page_Account/table_flexlist) 08-30-2018 08:23:02 下午 - [START] - Start action : Statement - println(table) TestObject - 'Object Repository/Page_Account_Statement/Page_Account/table_flexlist' 08-30-2018 08:23:02 下午 - [END] - End action : Statement - println(table) 08-30-2018 08:23:02 下午 - [START] - Start action : Statement - TableRows = CustomKeywords.com.example.WebUICustomKeywords.getHtmlTableRows(com.kms.katalon.core.testobject.ObjectRepository.findTestObject(Page_Account/table_flexlist), 'tbody') 08-30-2018 08:23:02 下午 - [INFO] - Finding Test Object with id 'Object Repository/Page_Account/table_flexlist' 08-30-2018 08:23:02 下午 - [INFO] - Checking timeout 08-30-2018 08:23:02 下午 - [INFO] - Finding web element with id: 'Object Repository/Page_Account/table_flexlist' located by 'By.xpath: //form[@id='frmv103']/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr[2]/td[2]/div/div[6]/table[@id='flexlist']' in '15' second(s) 08-30-2018 08:23:02 下午 - [INFO] - Found 1 web elements with id: 'Object Repository/Page_Account/table_flexlist' located by 'By.xpath: //form[@id='frmv103']/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr[2]/td[2]/div/div[6]/table[@id='flexlist']' in '15' second(s) 08-30-2018 08:23:02 下午 - [PASSED] - com.example.WebUICustomKeywords.getHtmlTableRows is PASSED 08-30-2018 08:23:02 下午 - [END] - End action : Statement - TableRows = CustomKeywords.com.example.WebUICustomKeywords.getHtmlTableRows(com.kms.katalon.core.testobject.ObjectRepository.findTestObject(Page_Account/table_flexlist), 'tbody') 08-30-2018 08:23:02 下午 - [START] - Start action : Statement - TableRows_All = TableRows.size() 08-30-2018 08:23:02 下午 - [START] - Start action : Statement - println(TableRows_All) 4 08-30-2018 08:23:02 下午 - [START] - Start action : Statement - TableColumns = CustomKeywords.com.example.WebUICustomKeywords.getHtmlTableColumns(TableRows[TableRows_All], "td") 08-30-2018 08:23:03 下午 - [PASSED] - com.example.WebUICustomKeywords.getHtmlTableColumns is PASSED 08-30-2018 08:23:03 下午 - [END] - End action : Statement - TableColumns = CustomKeywords.com.example.WebUICustomKeywords.getHtmlTableColumns(TableRows[TableRows_All], "td") 08-30-2018 08:23:03 下午 - [END] - End action : Statement - Account = TableColumns[9].text 08-30-2018 08:23:03 下午 - [START] - Start action : Statement - println(Account) 50904.00
以上执行结果获取的是第4行,第9列的text.
注意事项:
1.Katalon Studio此关键字以上用法获取的table的总行数,不包含标题;
2.获取某单元格的text的时候要根据实际情况去判断是否需要去掉标题行和第一列的计数;
作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可
文章评论(8)
要企业版才能用
TableRows[TableRows_All]为空了怎么做
CustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td')
看一下这个参数,是'td'还是'tr'
还有就是第一行计算一般从0开始,调用时,需要总行数需要减掉1.
对,刚才试了好久才发现这个问题,由于使用了for循环现在又有新的报错org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document,我尝试添加WebUI.delay(5)延时也没有成功
你好在吗,问题还是解决不了,在for循环调用时第二次ustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td') 这里就报element is not attached to the page document 的错误,不知道怎么解决了
你好,TableRows[TableRows_All]我这里报空了,不知道为什么
你好在吗,我想问下按你的方法前面都对了,但在TableColumns = CustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td') 的TableRows[TableRows_All]为空了,不知道为什么
自动化测试学习交流群:670250199