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 来返回 <div data-bind="foreach: renderedRows">
中的 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# 从下拉列表中选择一个选项?