
正文
Selenium三种等待元素的方式及代码,需要特别注意implicitlyWait的用法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
一、显式等待
1、显式等待:
就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.
2、代码:
new WebDriverWait(driver, 15).until(ExpectedConditions.presenceOfElementLocated(By.xpath(""))); //元素的xpath路径
注:这里的15是指要等待的秒数.如果没有满足until()方法中的条件,就会始终在这里wait 15秒,依然找不到,就抛出异常.
3、如果想对加载JS的代码做出判断,可以用以下方法:
Wait wait=new Wait() { //selenium自带
@Override
public boolean until() {
// TODO Auto-generated method stub
return webElement.isDisplayed();
}
};
二、隐式等待
1、隐式等待:
相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。
隐式等待使得WebDriver在查找一个Element或者Element数组时,如果一直查找不到,每隔一段特定的时间就会轮询一次DOM。
注:默认设置超时时间为0,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。
2、代码:
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); //1指等待1秒
三、线程休眠
Thread.sleep(1000); //1000指1000ms
四、实用的等待方法封装代码
public void waitForAllElementLoad(String type, String locator, int num,long timeout) {
try {
Thread.sleep(500);// 等待1秒,以便观察
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
System.out.println(e1.getMessage());
}
for (int second = 0;; second++) {
try {
if (second >= timeout) {
break;
}
if (isElementPresent(type, locator, num)) {
break;
}
Thread.sleep(500);
} catch (InterruptedException e) { }
}
}
public boolean isElementPresent(String elementType,String expression,int num) {
if(elementType.equals("className")){
//验证该元素是否在页面上显示 --isDisplayed()
try { if (getElementsBy(elementType,expression).get(num).isDisplayed()) {
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}else{
try { if (getElementBy(elementType,expression).isDisplayed()) {
return true;
} else {
return false;
}
} catch (NoSuchElementException e) {
return false;
}
}
}
//定位UI元素
public WebElement getElementBy(String elementType,String expression){
switch (elementType) {
case "xpath":
WebElement xpathelement = driver.findElement(By.xpath(expression));
return xpathelement;
case "id":
WebElement idelement = driver.findElement(By.id(expression));
return idelement;
case "className":
WebElement classNameelement = driver.findElement(By.className(expression));
return classNameelement;
case "linktext":
WebElement linktextelement = driver.findElement(By.linkText(expression));
return linktextelement;
case "name":
WebElement nameelement = driver.findElement(By.name(expression));
return nameelement;
case "partialLinkText":
WebElement partialLinkTextelement = driver.findElement(By.partialLinkText(expression));
return partialLinkTextelement;
case "cssSelector":
WebElement cssSelectorelement = driver.findElement(By.cssSelector(expression));
return cssSelectorelement;
default:
WebElement element = driver.findElement(By.xpath(expression));
return element; }
}






