Webdriver同步设置常用等待类主要如下图所示

注:support.ui包内类主要实现显性等待功能,timeouts()内方法主要实现隐性等待功能

一.线程休眠

Thread.sleep(long millis)

二.隐形等待

隐性等待:设置一次,driver整个生命周期中都在使用,不需要针对元素明确设置

driver.manage().timeouts().implicitlyWait(long outTime, TimeUnit unit);

全局设置,设置driver执行所有定位元素操作的超时时间

Parameters:outTime– 超时等待时间;unit– 时间单位.

Ex. 

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//超时等待时间为10S

三.显性等待

显性等待:需要等待的元素定位时需要逐一明确调用该等待方法

Figure 1 Support.ui包常用类UML

[常用等待模板]

  1. 等待元素加载

    1)WebDriverWait

new WebDriverWait(WebDriver driver, long timeOutInSeconds).until(ExpectedConditions.presenceOfElementLocated(By by))

注解

  • Parametersdriver-webdriver; timeOutInSeconds-超时等待时间(s; by-元素locator
  • timeOutInSeconds范围内,等待满足until()方法中的条件,即刻跳出等待。
  • 超出timeOutInSeconds,抛出异常.

    2)FluentWait

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)

             .withTimeout(long timeOut, TimeUnit unit)

             .pollingEvery(long duration, TimeUnit unit)

             .ignoring(exceptionType);

wait.until(ExpectedConditions.presenceOfElementLocated(By.by));

注解

  • Parametersdriver-webdriver;timeOut -超时等待时间(s);unit-时间单位; by-元素locator;

    duration-查找元素时间间隔 ;exceptionType-忽略异常类型,例如 默认NoSuchElementException.class

  • timeOut范围内,driver每隔dration定位一次元素,若遇到exceptionType则继续等待,直到满足until()方法中的条件,即刻跳出等待。
  • 超出timeOutInSeconds仍未满足until条件,抛出异常.

  2.等待并获取元素—仅需要修改until方法体

WebElement element = wait.until(
  new ExpectedCondition<WebElement>(){
    @Override
    public WebElement apply( WebDriver driver) {
        return driver.findElement( By by);
    }
  }
);

注解

  • Parametersdriver-webdriver从WebDriverWait|FluentWait实例化方法中获取; by-元素locator
  • Return:若定位到元素,返回webelement;否则报异常

[案例]

  1. 等待页面元素加载
    • WebDriverWait
Wait<WebDriver> wait = new WebDriverWait(driver,10);

wait.until(
ExpectedConditions. presenceOfElementLocated(By.id("myDynamicElement"))
);

方法功能:定位id=' myDynamicElement'的元素,超时等待时间为10S

    • FluentWait
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)

             .withTimeout(60, TimeUnit.SECONDS)

             .pollingEvery(10, TimeUnit.SECONDS)

             .ignoring(NoSuchElementException.class);

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

方法功能:定位id=' myDynamicElement'的元素,超时等待时间为60S,每隔10S定位一次,遇到NoSuchElementException报错忽略,继续等待直到超过60s。

  1. 等待并获取页面元素
    • WebDriverWait
Wait<WebDriver> wait = new WebDriverWait(driver, 10);

WebElement e = wait.until(
new ExpectedCondition< WebElement>(){ @Override
public WebElement apply( WebDriver d) {
return d.findElement( By.id( " myDynamicElement " ));
}
}
);

方法功能:定位id=' myDynamicElement'的元素,超时等待时间为10S,若定位到元素,直接返回元素

    • FluentWait
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(60, TimeUnit.SECONDS)
.pollingEvery(10, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class); WebElement element= wait.until(
new ExpectedCondition<WebElement>() {
@Override
public WebElement apply( WebDriver d) {
return d.findElement( By.id( " myDynamicElement " ));
}
}
);

方法功能:定位id=' myDynamicElement'的元素,超时等待时间为60S,每隔10S定位一次,60s内遇到NoSuchElementException报错忽略,继续等待;若定位到元素,直接返回该页面元素。

如果只是仅仅想判断页面是不是加载到某个地方了,就可以用第一种方法; 但如果需要得到某个WebElement,两种方式都可以,只是第一种方式还需要再多一步获取的操作.

四.Wait

FluentWait类是Wait接口的实现,直接使用wait接口可以更灵活的完成您需要的等待功能,例如

Wait w = new Wait(){

    @Override

    public boolean until() {

    return webElement.isDisplayed();

    }
};

这种等待的方式,据说在加载js代码的时候做判断会比较方便,目前没有调试成功。

五、其他

1.等待页面加载

driver.manage().timeouts().pageLoadTimeout(100, SECONDS);

注解:

  • pageloadTimeout方法只适用于firefox浏览器,Chrome等其他浏览器并不适用,但我们可以自己实现一个定时器
  • 该方法设置页面加载超时时间为100s
2.等待异步脚本加载
driver.manage().timeouts().setScriptTimeout(100,SECONDS);

尚未调试通过

【slenium专题】Webdriver同步设置的更多相关文章

  1. MySQL 5.5主从同步设置教程

    先修改Master(10.1.123.197)的 my.cnf 配置 在 [mysqld] 中新增以下内容 log-bin=mysql-bin log-bin-index=mysql-bin.inde ...

  2. vscode同步设置&扩展插件

    首先安装同步插件: Settings Sync 第二部进入你的github如图:  打开设置选项: 新建一个token: 如图:  记住这个token值 转到vscode 按shift+alt +u ...

  3. VSCode 同步设置及扩展插件 实现设备上设置统一

    准备工作:电脑上需安装VSCode,拥有一个github账户.实现同步的功能主要依赖于VSCode插件 "Settings Sync" Setting Sync 可同步包含的所有扩 ...

  4. mysql主主同步设置

    mysql主主同步设置 主主同步设置是同等的地位,所以以下操作在两台机器上都需要进行而且操作是相同的. 服务器 服务器代号 IP hostname A 192.168.70.128 Debian1 B ...

  5. VSCode 如何同步设置

    微软新推出的 VSCode 是一款开源.轻量.良心的开发工具,一经问世,迅速受到全球广泛开发者的好评与青睐,威风之下有干掉 Sublime Text 的趋势.然而有不少 VSCode 使用者吐槽其不能 ...

  6. NTP网络授时服务器部署及网络时钟同步设置说明

    NTP网络授时服务器部署及网络时钟同步设置说明 NTP网络授时服务器部署及网络时钟同步设置说明  本文由安徽京准科技提供@请勿转载. 一.前言 1.NTP简介 NTP是网络时间协议(Network T ...

  7. mycat数据库集群系列之mysql主从同步设置

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...

  8. SVN库实时同步设置

    为了安全起见,SVN服务器除了做定时全量备份和增量备份以外,如条件允许,可做实时备份. 这需要2台机器,一台是master server,另一台做mirror server.master做主服务,mi ...

  9. SQL2008 R2 主从数据库同步设置

    一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...

随机推荐

  1. runtime - 2 - 使用私有方法

    1. 创建 一个person类, 有对象方法, 私有化方法 2. 在h 文件里面 - (void)eat; //- (void)run:(NSInteger)metre; 3. 在m文件里面 -(vo ...

  2. discuz模板介绍

    1.discuz目录下template为模板目录 模板套系 discuz每套模板,支持不同的风格,而多个风格组成一套套系. 推荐使用复制的方法创建新的风格 (*默认的公共页面静态资源,存储在discu ...

  3. vi编辑时出现E325:ATTENTION

    我们用vi编辑文件时,系统会提示E325:ATTENTION. 这是由于在编辑该文件的时候异常退出了,因为vi在编辑文件时会创建一个交换文件swap file以保证文件的安全性. 但是每次打开文件时都 ...

  4. final修饰符:

    知识点: 1.final关键字用于修饰类.变量和方法 2.有点类似C#里的 sealed 关键字,用于表示它修饰的方法.变量和类不可以再被改变 3.final修饰变量时,表示该变量一旦获取了初始值,就 ...

  5. CComSafeArray

    https://blog.csdn.net/tangaowen/article/details/6554640

  6. 在cygwin中执行bat文件

    在cygwin中执行bat文件 #!/bin/bash dir_gen_image_bat=C:/MinGW/msys/1.0/home/Administrator/feitian_audio/FOT ...

  7. 非常实用的windows运行打开服务命令

    1.注册表-->regedit.exe 2.本地服务设置-->services.msc 3.远程桌面连接-->mstsc 4.检查windows版本-->winver 5.组策 ...

  8. C++之类和对象的使用(二)

    析构函数 析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一系列清理工作,使这部分内存可以被程序分配给新对象使用.对象生命周期结束,程序就自动执行析构函数来完成这些工作. 析构函数是一种 ...

  9. python3.4用循环往mysql5.7中写数据并输出

    #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" """ pyt ...

  10. Linux学习--2

    字符串 字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似 单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的:单引号字串中不能出现单引号(对 ...