GetElements仅来自parrent范围

时间:2017-04-22 13:55:15

标签: c# selenium

我有购物网站上的商品清单。有些项目的span style =“..”,有些没有样式。我只需要没有样式的跨度的文本值=“font-size:11px ...所以在这种情况下只有30美元和60美元。

    <span class="item_price"> <span style="font-size:11px;color:#d00;text-decoration:line-through">50 USD</span>&nbsp;&nbsp;&nbsp;&nbsp;
30 USD </span>                      
</div>
<span class="item_price">
60 USD</span>

以下代码返回来自同一类的所有文本值:

  IList<IWebElement> prices = driver.FindElements((By.ClassName("item_price")));

        foreach (var correctPrice in prices)
        {
            { Console.Write(correctPrice.Text); }

2 个答案:

答案 0 :(得分:1)

您不能,因为style的SPAN位于span.item_price内,因此当您在外部SPAN上执行.Text时,您也会从内部SPAN获取文本。您可以抓取span.item_price,然后遍历所有包含的元素,并从原始字符串中删除它们的.Text

static string RemoveChildText(IWebElement parent)
{
    string text = parent.Text;
    foreach (IWebElement e in parent.FindElements(By.CssSelector("*")))
    {
        text = text.Replace(e.Text, "");
    }

    return text.Trim();
}

然后将其称为

IReadOnlyCollection<IWebElement> prices = Driver.FindElements(By.CssSelector("span.item_price"));
Console.WriteLine(RemoveChildText(prices.ElementAt(0)));
Console.WriteLine(RemoveChildText(prices.ElementAt(1)));

我在您发布的HTML上对此进行了测试并返回了

30 USD
60 USD

答案 1 :(得分:0)

你可以使用xpath实现这一点,就像这样

IList<IWebElement> prices = driver.FindElements(By.Xpath("//span[@class='item_price' and not(span[contains(@style,'font-size')])]"));

        foreach (var correctPrice in prices)
        {
            { Console.Write(correctPrice.Text); }

这意味着,您正在寻找没有子跨度的跨度和一些标准