当前位置: 首页 > 面试题库 >

Selenium WebDriver:流畅的等待按预期方式工作,但隐式等待不起作用

嵇弘新
2023-03-14
问题内容

我是Selenium WebDriver的新手,正在尝试了解“等待”元素出现的正确方法。

我正在测试一个带有单选按钮答案的问题的页面。选择答案时,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);

这不能解决问题,并且我得到了NoSuchElementException。另外,我没有注意到10秒钟的暂停-
它只是立即出错。我已经验证了代码中的这一行是否已被调试器击中。我究竟做错了什么?为什么隐式等待不等待元素出现,而FluentWait会等待呢?

注意:正如我提到的,我已经有了解决方法,我真的只想知道为什么隐式等待不能解决我的问题。谢谢。


问题答案:

请记住,以下几种情况有所不同:

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

我的猜测是,如果某些页面使用javascript显示,则元素已经存在于浏览器DOM中,但不可见。隐式等待仅等待元素出现在DOM中,因此它会立即返回,但是当您尝试与该元素进行交互时,您会收到NoSuchElementException。您可以通过编写一个辅助方法来检验此假设,该方法显式等待元素可见或可单击。

一些示例(在Java中):

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();
}


 类似资料:
  • 问题内容: 我正在学习Java Maven Selenium。我想要在Selenium中使用这样的东西。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,

  • 问题内容: 这是我第一次使用selenium和无头浏览器,因为我想使用ajax技术来爬网某些网页。 效果很好,但是在某些情况下,加载整个页面会花费太多时间(尤其是当某些资源不可用时),因此我必须为selenium设置超时时间。 首先,我尝试了和,但是当我设置这些超时时,如果页面未完全加载,我将不会得到任何页面源,如下代码所示: 所以我尝试使用隐式等待和条件等待,如下所示: 这次我得到了想要的内容。

  • 问题内容: 我正在学习Java Maven Selenium。我希望在Selenium中使用。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,他们将在指

  • 基本页面类: 并在该类上实现: 我已经将参数编辑到50秒,但在Junit测试中没有等待。在使用AndroidDriver之前,我使用了WebDriver并且它工作得很好,但是我需要Android Driver来做TouchAction。所以我的测试用例总是失败,因为当assert运行时,它会立即找到元素,而元素还不可用。

  • 自从我开始使用Flatter以来,我面临着一个与Flatter async await相关的问题。大多数时候,我试图用未来和等待的结果,它跳过等待,并得到最短的方式返回 请帮助我更好地理解flatter async wait,或者告诉我哪里做错了,这样我就可以改进我的代码

  • 问题内容: 当隐式等待少于显式等待时,就会发生误解: 总时间:8.613秒。隐式设置等待第二个较低:3000,结果为6.865秒。它是如何工作的?预先感谢! 问题答案: 那是个好问题。许多优秀的QA自动化专家为此大吃一惊。 隐式等待 每个上都有特殊的隐藏自动等待。如果在页面DOM结构中找不到元素,则原始Web驱动程序(js,python,java)会引发NoSuchElementException