当前位置: 首页 > 知识库问答 >
问题:

Selenium WebDriver:Fluent wait如预期的那样工作,但隐式wait并非如此

仲孙经赋
2023-03-14

我正在测试一个页面,上面有一堆有单选按钮答案的问题。当您选择答案时,Javascript可能会启用/禁用页面上的某些问题。

问题似乎是Selenium“点击得太快”,没有等待Javascript完成。我尝试过用两种方法解决这个问题--显式等待解决了这个问题。具体地说,这是可行的,并解决了我的问题:

private static WebElement findElement(final WebDriver driver, final By locator, final int timeoutSeconds) {
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(timeoutSeconds, TimeUnit.SECONDS)
            .pollingEvery(500, TimeUnit.MILLISECONDS)
            .ignoring(NoSuchElementException.class);

    return wait.until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver webDriver) {
            return driver.findElement(locator);
        }
    });
}

但是,我更愿意使用一个隐式等待,而不是这样。我的web驱动程序配置如下:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

共有1个答案

孔飞翔
2023-03-14

请记住,以下几种场景是有区别的:

  • DOM中根本不存在的元素。
  • DOM中存在但不可见的元素。
  • DOM中存在但未启用的元素。(即可点击)

我的猜测是,如果某些页面是用javascript显示的,那么这些元素已经存在于浏览器DOM中,但不可见。隐式wait只等待一个元素出现在DOM中,因此它会立即返回,但当您尝试与该元素交互时,会得到一个NosuChelementException。您可以通过编写一个helper方法来测试这个假设,该方法明确表示等待元素是可见的或可单击的。

public WebElement getWhenVisible(By locator, int timeout) {
    WebElement element = null;
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    element = wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
    return element;
}

public void clickWhenReady(By locator, int timeout) {
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(locator));
    element.click();
}
 类似资料:
  • 为什么下面的失败? 测试的正确方法是什么?

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >

  • 我不明白为什么我的结果不同: 我有表订单和列价格(在mysql中键入double)。 数据库中的价格值为13.5。 查询: 结果是:1.21 查询: 结果是1.22 不舍入:结果为1.215 因此,一轮后的正确结果是1.22。 为什么查询

  • 最后是持久性上下文配置: 我很感谢你的帮助。

  • 我有两个Avro模式V1和V2,在spark中读取如下: V1有两个字段“一”和“二” V2 与新字段:“三” 场景:编写器使用 V1 进行写入,读取器使用 V2 对 avro 记录进行解码。我的期望是看到字段3填充了默认值,即null。但是我在spark工作中遇到了以下异常。 我是不是错过了什么?我的理解是avro支持向后兼容。