【问题标题】:Shelling an item from a list item从列表项中脱壳
【发布时间】:2026-02-09 16:50:02
【问题描述】:

我正在自动化某个网站,但我遇到了这种情况。我创建了一个列表,一切对我来说都很棒,它有 24 个元素。这些是来自商店的产品,包含它们的图片、名称、价格等。但是现在我需要从第一个元素中取出两件事并显示在控制台中,即名称和价格。有人可以提出建议吗?我坐下来思考,但什么也没说出来。我所做的只是发送一件物品的所有东西。

我尝试用一​​些 Linq 解决这个问题,但没有成功。

public List<string> ListOfElements()
{
    var elements = new List<string>();

    IReadOnlyCollection<IWebElement> listElements = _driver.FindElements(By.CssSelector(".category-list div[class='cat-prod-row js_category-list-item js_clickHashData js_man-track-event ']");

    foreach (IWebElement element in listElements)
    {
        elements.Add(element.Text);
    }

    return elements;
}

public void DisplayFirstElement()
{
    var firstElement = ListOfElements();
    Console.WriteLine(firstElement[0]);
}

我想获取第一个元素的名称和价格,然后断言其价格大于 10。

【问题讨论】:

    标签: c# list linq selenium


    【解决方案1】:

    您将所有元素属性扁平化为单个字符串集合。因此,您将失去这些字符串之间的任何关系。很难说列表中的第 22 个元素实际上是什么:它是价格吗?一个名字?完全不同的东西?它实际上属于哪个项目?

    相反,您应该只返回一个实体列表,然后打印第一个实体的属性:

    public List<IWebElement> ListOfElements()
    {
        var elements = new List<string>();
        return listElements = _driver.FindElements(By.CssSelector(".category-list div[class='cat-prod-row js_category-list-item js_clickHashData js_man-track-event ']");
    }
    
    public void DisplayFirstElement()
    {
        var allElements = ListOfElements();
        var firstElement = allElements.First();
        Console.WriteLine("FirstName: " + firstElement.Name + " Price: " + firstElement.Price);
    }
    

    当然,这假设您的IWebElement 有一个Name- 和一个Price- 属性。

    【讨论】: