Selenium WebDriver:如何计算列表中 DIV 元素的数量

Posted

技术标签:

【中文标题】Selenium WebDriver:如何计算列表中 DIV 元素的数量【英文标题】:Selenium WebDriver: how to count number of DIV elements in a list 【发布时间】:2021-03-27 14:27:32 【问题描述】:

我正在尝试使用 Selenium 计算网页上数据网格中的行数。每一行都由一个 div 表示,使用以下结构(针对本文进行了简化):-

<div id="resultsGrid">
    <div>
        <div>
            <div/>
            <div>
                <div class="canvas">
                    <div data-bind="foreach: renderedRows">
                        <div>list item</div>
                        <div>list item</div>
                        <div>list item</div>
                        <div>list item</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

通过阅读其他类似的帖子,我尝试使用以下代码和 XPath 来返回 &lt;div data-bind="foreach: renderedRows"&gt; 中的 div 数

var rowCount = webDriver.FindElements(By.XPath("//*[@id='usersResultsGrid']/div/div/div[2]/div/div")).Count;

每当我尝试此操作时,我只会返回 1,而不是预期的 4(在此示例中)。谁能指出我做错了什么的正确方向?

谢谢。

【问题讨论】:

已解决。答案是向 xpath 添加一个额外的 div,如 By.XPath("//*[@id='usersResultsGrid']/div/div/div[2]/div/div/div")。我最初的 xpath 指向 div 'data-bind' 元素,该元素的计数当然只有 1。 【参考方案1】:

已解决。答案是向 xpath 添加一个额外的 div,如 By.XPath("//*[@id='usersResultsGrid']/div/div/div[2]/div/div/div")。我最初的 xpath 指向 div 'data-bind' 元素,它的计数当然只有 1,我需要它下面的 div 列表。

【讨论】:

【参考方案2】:

在任何xpath 下方使用,这将标识所有四个元素。

//div[@id='resultsGrid']//div[@class='canvas']/div[@data-bind]/div

或者

//div[@id='resultsGrid']//div[@data-bind]/div

实际上你的代码将是

var rowCount = webDriver.FindElements(By.XPath("//div[@id='resultsGrid']//div[@class='canvas']/div[@data-bind]/div")).Count;

【讨论】:

如上,返回的 rowCount 为零。尝试了这两种方法以及等待语句以确保将其加载到 DOM 中。还有其他想法吗? 检查 DOM 元素是否必须在 iframe 中? 没有 iframe。【参考方案3】:

要使用Selenium 计算数据网格中的行数,您可以使用以下任一Locator Strategies:

CssSelector

var rowCount = webDriver.FindElements(By.XPath("div#resultsGrid div.canvas div[data-bind$='renderedRows'] > div")).Count;

XPath

var rowCount = webDriver.FindElements(By.XPath("//div[@id='resultsGrid']//div[@class='canvas']/div[contains(@data-bind, 'renderedRows')]/div")).Count;

理想情况下,您必须为所需的VisibilityOfAllElementsLocatedBy() 诱导 WebDriverWait,您可以使用以下任一Locator Strategies:

CssSelector

var rowCount = new WebDriverWait(webDriver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.CssSelector("div#resultsGrid div.canvas div[data-bind$='renderedRows'] > div")));

XPath

var rowCount = new WebDriverWait(webDriver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.XPath("//div[@id='resultsGrid']//div[@class='canvas']/div[contains(@data-bind, 'renderedRows')]/div")));

【讨论】:

尝试了这两种方法并获得 rowCount = 0。我在评估前进行了检查以确保它已加载到 DOM 中,甚至在那里进行了艰难的等待以完全确定,但仍然获得 0 的行数。

以上是关于Selenium WebDriver:如何计算列表中 DIV 元素的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium WebDriver 和 java 从下拉列表中选择一个项目?

如何使用 Python / Selenium webdriver 处理 Angularjs / Javascript 下拉列表?

如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

Python Selenium - 计算列表框中的项目数

Selenium Chrome webdriver Java:如何选择第n个列表项?