现在很多的 web 网站使用 AJAX 技术。当页面加载到浏览器,这个页面的很多元素显示出来的可能不一致。如果一个元素还未加载出来,在定位的时候,就会抛出异常:ElementNotVisibleException。这个时候就要使用等待方法解决。Webdriver 可以使用三种类型的等待方法:线程休眠、隐式等待和显示等待。
1.线程休眠
Thread.sleep(); //线程休眠,Java的Thread类里提供了休眠方法sleep,以毫秒为单位
Thread.sleep(1000); //等待1秒
----执行到这步就固定的等待 1 秒之后再接着执行后面的操作
2.隐式等待
隐式等待就是等待固定长度的时间。默认设置是 0 秒。一旦设置了隐式等待时间,它的作用范围就是 Webdriver 对象实例的整个生命周期,每次 Driver 执行找不到元素都会等待此处设置的时间
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);//设置全局等待5秒
driver.get("**********");
WebElement Element = driver.findElement(By.id("********"));
3.显式等待
这个相对上面两个就比较完美了,显示等待是只要条件成立,立即执行后续代码,如果没有满足条件,就会始终在这里等待条件成立,时间超出依然找不到,就抛出异常。
new WebDriverWait(driver, 15).until(ExpectedConditions.presenceOfElementLocated(By.id("***")));
上面的代码最多等待 15 秒,超时就会抛出 TimeoutException,如果执行到 1 秒时就出现这个元素了,就会马上继续执行后续代码。
driver:浏览器驱动
15:等待最长超时时间
WebDriverWait 后面可以使用的 until() 或者 until_not() 方法
until(method, message='')
参数使用 Expected Conditions 类中的判断方法验证,直到结果返回值为 True
until_not(method, message='')
参数使用 Expected Conditions 类中的判断方法验证,直到结果返回值为 False
Expected Conditions 类中常用的一些判断方法,下面方法中,有的传的是 locator,有的传的是 element,使用时要注意区分开来
titleIs:判断当前页面的 title 是否等于预期
titleContains:判断当前页面的 title 是否包含预期字符串
urlToBe:判断当前页面的 URL 是否等于预期
urlContains:判断当前页面的 url 是否包含预期字符串
presenceOfElementLocated:判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
visibilityOfElementLocated:判断某个元素是否可见.可见代表元素非隐藏,并且元素的宽和高都不等于 0
elementIfVisible:如果给定元素是可见的且具有非零大小,否则为 null
presenceOfAllElementsLocatedBy:判断是否至少有 1 个元素存在于 dom 树中。
textToBePresentInElement:判断某个元素中的 text 是否包含了预期的字符串
textToBePresentInElementValue:判断某个元素中的 value 属性是否包含了预期的字符串
invisibilityOfElementLocated:判断某个元素中是否不存在于 dom 树或不可见
invisibilityOfElementWithText:判断带有文本的元素要么不可见,要么文本不存在于元素上
elementToBeClickable:判断某个元素中是否可见并且是可以使用的,这样的话才叫 clickable
elementToBeSelected:判断某个元素是否被选中了,一般用在下拉列表
elementSelectionStateToBe:判断某个元素的选中状态是否符合预期
alertIsPresent:判断页面上是否存在 alert