硬性等待
Thread.sleep(long millis)
优点:使用简单
缺点:容易造成时间浪费
隐式等待
在设置的超时时间范围内不断查找元素,直到找到元素或者超时为止
如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
设置方式,放在运行代码之前
driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);
优点:
● 相对灵活
缺点:
● 设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待
● 只能等待元素存在,不能适用条件更复杂的情况,如:元素可点击、元素可见
WebDriver driver = openBrowser("chrom");
//设置隐式等待,单位一般为秒
//效果;在指定的时间范围内一直不断的循环找元素,直到找到元素为止,否则会报超时异常NoSuchElementException
//特点:全局设置,对下面的所有元素定位有效
driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
driver.get("http://8.129.91.152:8765/");
//登录
driver.findElement(By.xpath("//a[text()='登录']")).click();
Thread.sleep(2000);
driver.findElement(By.xpath("//input[@nullmsg='请输入手机号1']")).sendKeys("13323234545");
driver.findElement(By.xpath("//input[@nullmsg='请输入密码']")).sendKeys("12345678.");
driver.findElement(By.xpath("//button[text()='登录']")).click();
显式等待
显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码(如元素存在、元素 可点击、元素可见等)
WebDriverWait wait = new WebDriverWait();
WebElement element = wait.until(expectCondition);
优点: 每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,不存 在则继续等待,直到找到或超时。
显式等待不是全局设置,因此对需要等待的元素可以用以下方法处理:
方法 | 等待条件 |
---|---|
presenceOfElementLocated | 页面元素在页面中存在 |
visibilityOfElementLocated | 页面元素在页面存在并且可见 |
elementToBeClickable | 页面元素是否在页面上可被单击 |
driver.get("https://www.baidu.com");
//点击设置
driver.findElement(By.id("s-usersetting-top")).click();
WebDriverWait webDriverWait = new WebDriverWait(driver,8);
//until--->直到找到某个元素为止---》找到相应的元素
//visibilityOfElementLocated--->等待元素的见
WebElement webElement = webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[text()='高级搜索']")));
webElement.click();
加入元素等待可解决:由于网络原因,元素未加载出来时就进行操作而导致的找不到元素异常
但需注意:显示等待和隐式等待不可混用,否则会有不可预料的等待时间,建议使用显示等待