Selenium如何为UI Grid网格赋值?动态类名文本框定位求助
UI Grid动态单元格定位与赋值可行方案
对应网格截图:
核心定位逻辑
UI Grid生成的DOM中,class的动态后缀、id前缀的时间戳均为渲染时随机生成,不可作为定位依据,需使用以下稳定属性/特征实现定位:
- 固定属性:
role="gridcell"标识所有网格单元格,class="ui-grid-cell-contents"标识单元格内容区域(需赋值的文本框所在容器) - 结构特征:单元格按行+列有序排列,同列单元格在父行节点下的顺序固定
具体实现方案
1. 相对位置XPath定位(最常用,稳定性高)
根据操作的单元格的行列位置、关联单元格内容写XPath规则,完全不依赖动态属性:
- 按「第N行第M列」定位:
//div[@role='gridrow'][{行索引}]/div[@role='gridcell'][{列索引}]/div[@class='ui-grid-cell-contents']
例:定位第2行第3列单元格的XPath为//div[@role='gridrow'][2]/div[@role='gridcell'][3]/div[@class='ui-grid-cell-contents'] - 按关联单元格内容定位:如果某行的标识列有固定内容,可匹配后定位目标列,例:匹配第一列值为「固定资产」的行,定位该行第4列的单元格:
//div[@role='gridcell'][text()='固定资产']/following-sibling::div[@role='gridcell'][3]/div[@class='ui-grid-cell-contents']
2. AngularJS数据模型直接赋值(最稳定,适合自动化场景)
UI Grid是AngularJS实现的组件,直接操作数据层比操作DOM更可靠,无需关注DOM变化:
- 获取网格任意单元格的Angular scope:
const cellScope = angular.element(document.querySelector('.ui-grid-cell')).scope() - 直接给对应行的字段赋值:
cellScope.row.entity[你要修改的列绑定字段名] = '需要填入的数值' - 触发视图更新:
cellScope.$apply()
3. 表头匹配列索引定位
如果列的顺序固定,可先通过表头文本匹配到目标列的索引,再结合行号定位对应单元格:
- 先获取目标列索引:
const targetColIndex = Array.from(document.querySelectorAll('.ui-grid-header-cell')).findIndex(el => el.textContent.trim() === '你要的列表头文本') - 定位对应行的目标单元格:
document.querySelector(.ui-grid-row:nth-child({行号}) .ui-grid-cell:nth-child(${targetColIndex+1}) .ui-grid-cell-contents)
注意事项
- 不要使用带随机后缀的class(如
ui-grid-coluiGrid-0016)、完整id属性作为定位依据,每次页面渲染值都会变化 - 赋值前如果是可编辑输入框,需要先点击激活单元格,触发UI Grid的编辑模式后再输入内容
内容的提问来源于stack exchange,提问作者Shankar R
相关产品推荐
相关产品推荐

