Katalon Studio处理table并获取单元格数值

2018年8月31日 4.2k 次阅读 7 条评论 4 人点赞

写在前面

博主最近在使用Katalon Studio实施UI自动化测试。
在做账务检查脚本开发的时候,需要获取一些交易明细中的前后数值进行核算对比,验证数据的准确性。
在获取数据的时候,发现需要定位table中元素,并且获取table中指定单元格的数据。如何获取呢?
把问题抽象化:
1.所有的html table不外乎是由 table 元素以及一个或多个 tr、th 或 td 元素组成;
2.我们可以将行和列参数化,通过传入行和列的值定位单元格获取返回的text信息;
这样我们可以根据输入参数获取任意一个cell的数据了。
需要获取数据的前端界面如下图所示(该系统使用的是IE8浏览器):
tableHTML代码截图:
table2

解决问题

处理问题思路:
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 List getHtmlTableRows(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试图使用方法如下:table3Sprint脚本试图代码:

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的时候要根据实际情况去判断是否需要去掉标题行和第一列的计数;

风里云里,我在这里等你!

文章评论(7)

  • 自动化测试学习中

    TableRows[TableRows_All]为空了怎么做

    2019年5月28日
    • Altumn

      CustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td')

      看一下这个参数,是'td'还是'tr'
      还有就是第一行计算一般从0开始,调用时,需要总行数需要减掉1.

      2019年5月28日
      • 自动化测试学习中

        对,刚才试了好久才发现这个问题,由于使用了for循环现在又有新的报错org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document,我尝试添加WebUI.delay(5)延时也没有成功

        2019年5月28日
        • 自动化测试学习中

          你好在吗,问题还是解决不了,在for循环调用时第二次ustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td') 这里就报element is not attached to the page document 的错误,不知道怎么解决了

          2019年5月29日
  • 自动化测试

    你好,TableRows[TableRows_All]我这里报空了,不知道为什么

    2019年5月28日
  • 自动化测试学习中

    你好在吗,我想问下按你的方法前面都对了,但在TableColumns = CustomKeywords.'com.example.WebUICustomKeywords.getHtmlTableColumns'(TableRows[TableRows_All], 'td') 的TableRows[TableRows_All]为空了,不知道为什么

    2019年5月28日
  • 11

    自动化测试学习交流群:670250199

    2019年3月28日