Selenium 隐式vs显式vs流畅等待

Selenium 隐式vs显式vs流畅等待,selenium,selenium-webdriver,webdriverwait,implicitwait,fluentwait,Selenium,Selenium Webdriver,Webdriverwait,Implicitwait,Fluentwait,隐式、显式和流畅的等待之间有什么区别 如果我们在隐式等待中设置10秒,在10秒之前,在3秒内只找到元素 到时会发生什么?它将等待10秒或继续进行。ImplicitWait 是一种配置实例的实现,即驱动程序在一定时间内轮询实例(例如纳秒,微秒,毫秒,秒,分钟,小时或天)当试图查找一个或多个元素时,如果这些元素不立即可用。默认设置为0,这意味着驱动程序在找到一条或多条查找元素的指令时,将立即开始搜索并提供结果 在这种情况下,在重新加载网页后,立即搜索可能会/可能找不到一个或多个元素。因此,您可能面临

隐式、显式和流畅的等待之间有什么区别


如果我们在隐式等待中设置10秒,在10秒之前,在3秒内只找到元素

到时会发生什么?它将等待10秒或继续进行。

ImplicitWait 是一种配置实例的实现,即驱动程序在一定时间内轮询实例(例如
纳秒
微秒
毫秒
分钟
小时
)当试图查找一个或多个元素时,如果这些元素不立即可用。默认设置为0,这意味着驱动程序在找到一条或多条查找元素的指令时,将立即开始搜索并提供结果

在这种情况下,在重新加载网页后,立即搜索可能会/可能找不到一个或多个元素。因此,您可能面临以下任何例外情况:

  • NoTouchElementException
  • TimeoutException
  • ElementNotVisibleException
  • ElementNotSelectableException
因此你需要诱导。通过引入,驱动程序将轮询配置的查找一个或多个元素的时间。到那时,您一直在寻找的一个或多个元素可能在DOM中可用。在代码中,您已经将值设置为10秒,驱动程序将轮询DOM10

  • Python:

    driver.implicitly_wait(10)
    
    driver.implicitly_wait(5)
    
    driver.implicitly_wait(0)
    
  • 爪哇:

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    
最后,一旦您设置了ImplicitWait,WebDriver实例(即驱动程序)就能够携带此配置直到其生命周期。但是,如果您需要更改WebDriver实例的大致时间,即将驱动程序更改为wait,则可以按如下方式重新配置:

  • Python:

    driver.implicitly_wait(10)
    
    driver.implicitly_wait(5)
    
    driver.implicitly_wait(0)
    
  • 爪哇:

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    
如果您想在任何时候取消隐式等待,可以按如下方式重新配置它:

  • Python:

    driver.implicitly_wait(10)
    
    driver.implicitly_wait(5)
    
    driver.implicitly_wait(0)
    
  • 爪哇:

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

流畅的等待 是接口的实现,通过该接口,我们可以动态配置超时时间和轮询间隔。可以定义FluentWait实例来配置等待条件的最长时间以及必须检查条件的频率。用户还可以将等待配置为在等待元素时忽略特定类型的异常,例如页面上的NoTouchElementException

  • 用法:

       // Waiting 30 seconds for an element to be present on the page, checking
       // for its presence once every 5 seconds.
       Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
           .withTimeout(30, SECONDS)
           .pollingEvery(5, SECONDS)
           .ignoring(NoSuchElementException.class);
    
       WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
         public WebElement apply(WebDriver driver) {
           return driver.findElement(By.id("foo"));
         }
       });
    
    说明: ExplicitWait的这个实现在抛出
    TimeoutException
    之前等待10秒,或者如果找到元素,它将在0到10秒内返回。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回。ExpectedCondition函数类型的成功返回值是true或NOTNULL对象的
    布尔值


    预期条件: 在自动化Web浏览器以测试Web/Mobile应用程序时,经常会遇到一些情况。Java、C#和Python绑定包括这些方便的方法,因此我们不必自己编写ExpectedCondition类或为它们创建自己的实用程序包。一些预期条件包括:

    • alertIsPresent()
    • elementtobelickable(定位器)
    • elementToBeSelected(WebElement)
    • frametobeavailable和switchtoit(定位器)
    • 不可见性(元素)
    您可以在这里找到所有支持的方法


    此特定查询:
    • 在搜索单个元素时,驱动程序将轮询OM,直到找到该元素或配置的超时过期,然后抛出
      NoTouchElementException
    • 当搜索多个元素时,驱动程序将轮询DOM,直到找到至少一个元素或配置的超时已过期

    因此,根据第一种情况,如果我们在隐式等待中设置10秒,并且在10秒之前,仅在3秒内找到元素,则驱动程序将仅等待3秒


    该时间将继续,而不是等待设置的时间。

    隐式等待将告诉web驱动程序在抛出“NosTouchElementException”之前等待一定的时间。默认设置为0。一旦我们设置了时间,web驱动程序将在抛出异常之前等待该时间。若你们给了10秒作为等待时间,但元素被标识为3秒,那个么它将在3秒后进入下一步


    显式等待是您定义的代码,用于在继续执行代码之前等待特定条件发生。显式等待将告诉web驱动程序在抛出NoTouchElementException异常之前等待某些条件,如ElementLocated的可见性和最长时间。如果我在时间之前完全满足了预期条件,那么您可以将此-

    同样的问题用于显式等待。届时将继续进行或等待提及时间?请在此处发布问题之前用谷歌搜索答案,如果您有具体疑问,请更新问题。