【selenium】元素三大等待方法
自动化测试为什么需要用到等待方法呢?
当通过selenium实现自动化测试的时候,驱动的页面代码加载时间各不相同,有的时候加载时间过长就会造成超时,超时之后,后面的代码就会找不到对应的元素,导致经常会报找不到元素的错误,所以为了保证自动化代码高可用和稳定性,引入了等待方法。
1.硬性等待
硬性等待Thread.sleep(millis),单位为毫秒;这是一种简单粗暴的等待方法,设置等待多长时间就等待多长时间。使用该方法需要抛出异常。
package com.test.selenium; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; /** *设置硬性等待时间 * */ public class App { public static void main( String[] args ) throws InterruptedException { System.setProperty("webdriver.chrome.bin", "G:/chromedriver.exe"); WebDriver driver = new ChromeDriver(); String url = "https://www.baidu.com/"; System.out.printf("访问百度:",url); driver.get(url); driver.manage().window().maximize(); //设置等待时间为4s Thread.sleep(4000); WebElement target = driver.findElement(By.id("kw")); target.sendKeys("selenium"); driver.quit(); System.out.println( "执行结束" ); } }
2.隐式等待
隐式等待是相对于硬性等待来说,更为灵活的一种等待方法,在设置的时间范围内不断的查找元素,直到找到元素或者超时,这种方法需要在webDriver实例化后使用,通过隐式等待实现代码等待,是针对全局的,在webDriver实例的整个生命周期都有效,然而这也是隐式等待的一个缺点,并不是所有的元素都需要用到等待。
package com.test.selenium; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; /** *设置隐式等待时间 * */ public class App { public static void main( String[] args ){ System.setProperty("webdriver.chrome.bin", "G:/chromedriver.exe"); WebDriver driver = new ChromeDriver(); //设置隐式等待,等待时间为3s driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS); String url = "https://www.baidu.com/"; System.out.printf("访问百度:",url); driver.get(url); driver.manage().window().maximize(); WebElement target = driver.findElement(By.id("kw")); target.sendKeys("selenium"); driver.quit(); System.out.println( "执行结束" ); } }
3.显式等待
显式等待是在某个条件发生再继续执行后再继续执行后面的代码。是比较智能的等待方法。下面是比较常用的方法;
方法 | 描述 |
ExpectedConditions.invisibilityOfElementLocated | 页面元素在页面存在并且可见 |
ExpectedConditions.elementToBeClickable | 页面元素是否在页面上可用和可被单击 |
ExpectedConditions.elementToBeSelected | 页面元素处于被选中的状态 |
ExpectedConditions.textToBePresentInElement | 在页面元素中是否包含特定的文本 |
ExpectedConditions.presenceOfElementLocated | 页面元素在页面中存在 |
相关代码实现如下:
package com.test.selenium; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; /** *设置显式等待时间 * */ public class App { public static void main( String[] args ){ System.setProperty("webdriver.chrome.bin", "G:/chromedriver.exe"); WebDriver driver = new ChromeDriver(); String url = "https://www.baidu.com/"; System.out.printf("访问百度:",url); driver.get(url); driver.manage().window().maximize(); WebDriverWait wait = new WebDriverWait(driver,5); //页面元素在页面存在并且可见 wait.until(ExpectedConditions.presenceOfElementLocated(By.id("kw"))); WebElement target = driver.findElement(By.id("kw")); target.sendKeys("selenium"); driver.quit(); System.out.println("执行结束"); } }