现在很多的web网站使用AJAX技术。当页面加载到浏览器,这个页面的很多元素显示出来的可能不一致。如果一个元素还未加载出来,在定位的时候,就会抛出异常:ElementNotVisibleException。这个时候就要使用等待方法解决。Webdriver可以使用三种类型的等待方法:线程休眠、隐式等待和显示等待。
1.线程休眠
Thread.sleep(); //线程休眠,Java的Thread类里提供了休眠方法sleep,以毫秒为单位
Thread.sleep(1000); //等待1秒
----执行到这步就固定的等待1秒之后再接着执行后面的操作
* 当然了有缺点,还很大,一般调试时可以使用,实际运行case不要使用
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