Selenium:visibilityOf元素等待失效,立即抛出NoSuchElementException
Selenium未按预期等待元素可见的问题分析与解决
问题场景
你编写了如下代码,预期等待最多15秒直至ID为given_name的输入框可见后输入文本:
Browser.Wait(15).until(ExpectedConditions.visibilityOf(driver.findElement(By.id("given_name")))).sendKeys(selectAll + fornavnOgEtternavn.getFornavn());
对应的HTML结构:
<form id="egendefinert" action="..." method="post"> <h2>Egendefinert bruker</h2> <input type="hidden" name="custom" value="true"> <div class="inputfelt avansertModus" style="display: none;"> <div class="label-wrapper"> <label for="preferred_username"> <span>Brukernavn</span> <span class="label-description">(preferred_username)</span> </label> </div> <input name="preferred_username" id="preferred_username"> </div> <div class="inputfelt "> <div class="label-wrapper"> <label for="given_name"> <span>Fornavn</span> <span class="label-description">(given_name)</span> </label> </div> <input name="given_name" id="given_name"> </div> ...
执行测试时程序立即抛出错误,未进入等待逻辑:
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"#given_name"}
但设置断点逐步调试时代码可正常运行。
原因分析
问题出在代码的逻辑顺序上:
visibilityOf()方法的参数是已经找到的WebElement对象,所以你在调用这个方法时,提前执行了driver.findElement(By.id("given_name"))。- 这行查找元素的代码会立即执行,如果此时元素还未加载完成,直接抛出
NoSuchElementException,根本没触发Selenium的等待机制。 - 调试时因为手动停顿了足够时间,页面元素已经加载完毕,所以
driver.findElement能找到元素,代码正常执行。
解决方案
改用visibilityOfElementLocated()方法,这个方法接收By定位器作为参数,会在等待周期内重复尝试查找元素,直到元素可见或者超时,完全符合你的预期逻辑。
修正后的代码:
Browser.Wait(15).until(ExpectedConditions.visibilityOfElementLocated(By.id("given_name"))).sendKeys(selectAll + fornavnOgEtternavn.getFornavn());
内容的提问来源于stack exchange,提问作者kakemonsteret
相关产品推荐
相关产品推荐

