硒只得到 1 个需要收集的多种元素

Selenium get only 1 in multi elements need to collect

提问人: 提问时间:5/17/2023 最后编辑:Ajeet Verma 更新时间:6/21/2023 访问量:28

问:

顾名思义,driver->findElements 只得到 1,但检查器显示 22 个项目。我还暂停了该过程,使用等待页面满载,因为 AJAX 请求。所以 Kotlin 线条如此简单。div.classnameA.classnameAThread.sleep(15)

System.setProperty("webdriver.chrome.driver","src/main/kotlin/org/drivers/chromedriver")
val driver = ChromeDriver()
driver.get("https://somethingcool.com")
try {
   Thread.sleep(10000)
} finally {
  var e = driver.findElements(By.cssSelector(".classnameA"))
  println(e.size)
}

有趣的是,如果我更改为 findElement ,它会返回页面上的所有 5 个元素。.classnameB

Kotlin Selenium-WebDriver CSS 选择器 getElementsByClassName

评论


答:

0赞 attila-fazekas 6/21/2023 #1

关于共享代码的几件事:

  1. 从 Selenium 版本 4.6 开始,您不再需要管理浏览器二进制文件。有关详细信息,请参阅此链接。因此,您可以删除第一行。

  2. 通常,不鼓励使用 Thread.sleep() 调用等待元素,您应该使用 Selenium 等待之一 - 最好是显式等待。有关详细信息,请参阅此链接

话虽如此,假设提供的定位器是正确的,您可以在 Kotlin 中执行类似操作:

var wait: Wait<WebDriver> = FluentWait(driver)
    .withTimear wait: Wait<WebDriver> = FluentWait(driver)
    .without(Duration.ofSeconds(10))
    .pollingEvery(Duration.ofSeconds(1))
    .ignoring(NoSuchElementException::class.java)

var elements: List<WebElement> = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(".classnameA")))

您也可以尝试例如numberOfElementsToBe或其他方法来等待元素。

如果代码仍然无法找到元素,我建议尝试不同的定位器策略,例如.className

评论

0赞 6/21/2023
感谢您的 numberOfElementsToBe。我得到的解决方案不是等待,而是滚动。因为 Web 是由 JavaScript 渲染的,所以元素在滚动到其位置时会动态出现。
0赞 attila-fazekas 6/22/2023
然后,您可以尝试先通过将驱动程序转换为 JavaScriptexecutor 来向下滚动。有关参考,请参阅 browserstack.com/guide/selenium-scroll-tutorial 上的“如何向下滚动到 Selenium 中的元素,直到它可见”