如何在Selenium Basic中用XPath获取可输入框的行列名称
解决行列名称获取的XPath问题
问题根源
你用./th获取行名称的逻辑错误——包含输入框的数据行(<tr>)里没有<th>标签,<th>仅存在于表头行;数据行的行标识(如USD1、USD2)是在第一个<td>内的<span>元素中。
修正后的代码及XPath说明
1. 获取行名称(如USD2)
替换行名称的获取代码:
Dim rowName As String rowName = rowElement.FindElementByXPath(".//td[1]/span").Text
如果<td>的文本与内部<span>完全一致,也可以简化为:
rowName = rowElement.FindElementByXPath(".//td[1]").Text
逻辑:.//td[1]定位当前行的第一个单元格,再通过/span精准提取行标识文本。
2. 获取列名称(如Bid)
原列XPath的位置计算逻辑有误,修正后直接关联输入框所在单元格与表头对应列:
Dim columnHeaderElement As WebElement Set columnHeaderElement = Example.FindElementByXPath("./ancestor::table/tr[1]/th[position() = count(./ancestor::td/preceding-sibling::td) + 1]") Dim columnName As String columnName = columnHeaderElement.Text
逻辑:
./ancestor::td定位输入框所在的单元格count(./ancestor::td/preceding-sibling::td) + 1计算该单元格在当前行的位置(从1开始计数)- 匹配表头行(
tr[1])中对应位置的<th>,提取列名称
完整修正代码片段
Table = driver.FindElementById("ctl00_ContentPlaceHolder1_GridView1") Example = Table.FindElementById("ctl00_ContentPlaceHolder1_GridView1_ctl03_txtBid") Dim rowElement As WebElement Set rowElement = Example.FindElementByXPath("./ancestor::tr") ' 获取行名称 Dim rowName As String rowName = rowElement.FindElementByXPath(".//td[1]/span").Text ' 获取列名称 Dim columnHeaderElement As WebElement Set columnHeaderElement = Example.FindElementByXPath("./ancestor::table/tr[1]/th[position() = count(./ancestor::td/preceding-sibling::td) + 1]") Dim columnName As String columnName = columnHeaderElement.Text
验证结果
针对输入框ctl00_ContentPlaceHolder1_GridView1_ctl03_txtBid,会正确返回:
- 行名称:
USD2 - 列名称:
Bid
内容的提问来源于stack exchange,提问作者Lv Linh
相关产品推荐
相关产品推荐

