如何在Protractor中验证表格所有行的列数据
嘿,我看你这段用来验证表格列数据的代码没写完,而且还有几个容易踩坑的点——比如WebDriver的元素操作全是异步的,直接同步处理肯定会出问题!我帮你补全并优化了代码,顺便把关键细节说清楚:
你的原始代码(截断部分已标注)
var mytable = element(By.xpath("//div[@class='col-sm-12']/table/tbody")); let rows_table: any = mytable.findElements(By.tagName("tr")); console.log("rows_table"+rows_table); browser.sleep(10000); let rows_count: any = rows_table.size(); for (var row = 0; row < rows_count; row++) { var Columns_row = rows_table.get(row).findElements(By.tagName("td")); var columns_count = Columns... // 这里代码截断了 }
修正后的完整验证代码(以验证第2列所有行数据为例)
// 建议用async函数包裹,因为所有WebDriver操作都是异步的 async function validateTableColumn() { // 定位表格tbody,尽量用更稳定的定位器(比如表格有id的话优先用id) const mytable = element(By.xpath("//div[@class='col-sm-12']/table/tbody")); // 等待表格加载完成(比browser.sleep更可靠) await browser.wait(ExpectedConditions.presenceOf(mytable), 10000, "表格未加载"); // 获取所有行,必须await拿到实际元素数组 const rows_table = await mytable.findElements(By.tagName("tr")); console.log(`表格共有 ${rows_table.length} 行`); // 遍历每一行,验证指定列(比如第2列,索引为1,因为从0开始) for (const row of rows_table) { // 获取当前行的所有单元格 const columns = await row.findElements(By.tagName("td")); // 获取目标列的文本 const columnText = await columns[1].getText(); // 这里写你的验证逻辑,比如验证文本是否符合预期格式 console.log(`当前行第2列内容:${columnText}`); // 示例:验证文本不为空 expect(columnText).not.toBeEmpty(); // 或者验证是否符合特定规则,比如是数字 expect(columnText).toMatch(/^\d+$/); } } // 调用函数执行验证 validateTableColumn();
关键注意事项
- 必须用async/await:WebDriver的
findElements()、getText()、size()等方法都返回Promise,直接赋值会拿到Promise对象而不是实际元素/数据,必须用await等待异步操作完成。 - 替换browser.sleep:硬编码的sleep不够可靠,建议用
ExpectedConditions等待元素加载完成,避免因页面加载慢导致的元素找不到问题。 - 指定目标列:如果只需要验证某一列,不用遍历所有单元格,直接通过索引获取目标列即可(注意索引从0开始)。
- 类型优化:尽量不要用
any类型,比如可以把rows_table定义为ElementArrayFinder或者WebElement[],让代码更规范。
内容的提问来源于stack exchange,提问作者Shruti
相关产品推荐
相关产品推荐

