提问人: 提问时间:5/17/2023 最后编辑:Ajeet Verma 更新时间:6/21/2023 访问量:28
硒只得到 1 个需要收集的多种元素
Selenium get only 1 in multi elements need to collect
问:
顾名思义,driver->findElements 只得到 1,但检查器显示 22 个项目。我还暂停了该过程,使用等待页面满载,因为 AJAX 请求。所以 Kotlin 线条如此简单。div.classnameA
.classnameA
Thread.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
答:
0赞
attila-fazekas
6/21/2023
#1
关于共享代码的几件事:
从 Selenium 版本 4.6 开始,您不再需要管理浏览器二进制文件。有关详细信息,请参阅此链接。因此,您可以删除第一行。
通常,不鼓励使用 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 中的元素,直到它可见”
上一个:从DOM替换表单,带有id的元素
评论