现在很多的 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


↙↙↙阅读原文可查看相关链接,并与作者交流