来自包含跨度的行的 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");