来自包含跨度的行的 C# Selenium XPath 数据
C# Selenium XPath data from row that contains a span
我正在尝试从具有两列的 table 中获取数据。这些行没有不同的标识符。但我可以在第一列中搜索具体信息,以确定是否应该获取第二列的数据。 table 中有多行,尽管下面的示例我只显示了一行。
<table id="subtotals-marketplace-table" class="a-normal a-align-bottom a-spacing-none a-size-small">
<tbody><tr class="small-line-height">
<td>
<span>
Total:
</span>
</td>
<td class="a-text-right aok-nowrap a-nowrap">
.80
</td>
</tr>
</tbody></table>
我需要搜索总计:然后在下一列中获取美元金额。我已经按照这些思路尝试了多次迭代,但似乎找不到正确的语法:
driver.FindElement(
By.XPath(
"//*[@id='subtotals-marketplace-table']//td[contains(text(),'Total:')]/following-sibling::td[1]"))
.Text;
driver.FindElement(
By.XPath(
"//table[@id='subtotals-marketplace-table']//td[contains(text(),'Total:')]/following-sibling::td[1]"))
.Text;
driver.FindElement(
By.XPath(
"//table[@id='subtotals-marketplace-table']/tbody//td[contains(text(),'Total:')]/following-sibling::td[1]"))
.Text;
这里有不同的选项。
选项 1:
//table[@id='subtotals-marketplace-table']//tr[td[normalize-space(.)='Total:']]/td[2]
选项 2:
//table[@id='subtotals-marketplace-table']//td[normalize-space(.)='Total:']/following-sibling::td
尝试使用 Xpath。
//table[@id='subtotals-marketplace-table']//tr//td[@class='a-text-right aok-nowrap a-nowrap']
或
//table[@id='subtotals-marketplace-table']//tr//span[contains(.,'Total:')]/parent::td/following-sibling::td[@class='a-text-right aok-nowrap a-nowrap']
要找到文本 Total 然后提取与 $ 关联的金额,您可以使用以下解决方案:
driver.FindElement(By.XPath("//table[@id='subtotals-marketplace-table']/tbody//td/span[contains(.,'Total:')]//following::td[1]")).GetAttribute("innerHTML");
更新
正如您所看到的错误 Unable to locate an element with the xpath expression,可能您必须为要点击的元素,您可以使用以下解决方案:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.TextToBePresentInElementLocated(By.XPath("//table[@id='subtotals-marketplace-table']/tbody//td/span[contains(.,'Total:')]/following::td[1]"), "$")).GetAttribute("innerHTML");
我正在尝试从具有两列的 table 中获取数据。这些行没有不同的标识符。但我可以在第一列中搜索具体信息,以确定是否应该获取第二列的数据。 table 中有多行,尽管下面的示例我只显示了一行。
<table id="subtotals-marketplace-table" class="a-normal a-align-bottom a-spacing-none a-size-small">
<tbody><tr class="small-line-height">
<td>
<span>
Total:
</span>
</td>
<td class="a-text-right aok-nowrap a-nowrap">
.80
</td>
</tr>
</tbody></table>
我需要搜索总计:然后在下一列中获取美元金额。我已经按照这些思路尝试了多次迭代,但似乎找不到正确的语法:
driver.FindElement(
By.XPath(
"//*[@id='subtotals-marketplace-table']//td[contains(text(),'Total:')]/following-sibling::td[1]"))
.Text;
driver.FindElement(
By.XPath(
"//table[@id='subtotals-marketplace-table']//td[contains(text(),'Total:')]/following-sibling::td[1]"))
.Text;
driver.FindElement(
By.XPath(
"//table[@id='subtotals-marketplace-table']/tbody//td[contains(text(),'Total:')]/following-sibling::td[1]"))
.Text;
这里有不同的选项。
选项 1:
//table[@id='subtotals-marketplace-table']//tr[td[normalize-space(.)='Total:']]/td[2]
选项 2:
//table[@id='subtotals-marketplace-table']//td[normalize-space(.)='Total:']/following-sibling::td
尝试使用 Xpath。
//table[@id='subtotals-marketplace-table']//tr//td[@class='a-text-right aok-nowrap a-nowrap']
或
//table[@id='subtotals-marketplace-table']//tr//span[contains(.,'Total:')]/parent::td/following-sibling::td[@class='a-text-right aok-nowrap a-nowrap']
要找到文本 Total 然后提取与 $ 关联的金额,您可以使用以下解决方案:
driver.FindElement(By.XPath("//table[@id='subtotals-marketplace-table']/tbody//td/span[contains(.,'Total:')]//following::td[1]")).GetAttribute("innerHTML");
更新
正如您所看到的错误 Unable to locate an element with the xpath expression,可能您必须为要点击的元素,您可以使用以下解决方案:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.TextToBePresentInElementLocated(By.XPath("//table[@id='subtotals-marketplace-table']/tbody//td/span[contains(.,'Total:')]/following::td[1]"), "$")).GetAttribute("innerHTML");