Selenium三种等待元素的方式及代码,需要特别注意implicitlyWait的用法

时间:2021-03-18 19:53:15

一、显式等待

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

四、实用的等待方法封装代码

 

 1 public void waitForAllElementLoad(String type, String locator, int num,long timeout) {
2 try {
3 Thread.sleep(500);// 等待1秒,以便观察
4 } catch (InterruptedException e1) {
5 // TODO Auto-generated catch block
6 System.out.println(e1.getMessage());
7 }
8 for (int second = 0;; second++) {
9 try {
10 if (second >= timeout) {
11 break;
12 }
13 if (isElementPresent(type, locator, num)) {
14 break;
15 }
16 Thread.sleep(500);
17 } catch (InterruptedException e) {
18
19 }
20 }
21 }

 

 1 public boolean isElementPresent(String elementType,String expression,int num) {
2 if(elementType.equals("className")){
3 //验证该元素是否在页面上显示 --isDisplayed()
4 try { if (getElementsBy(elementType,expression).get(num).isDisplayed()) {
5 return true;
6 } else {
7 return false;
8 }
9 } catch (Exception e) {
10 return false;
11 }
12 }else{
13 try { if (getElementBy(elementType,expression).isDisplayed()) {
14 return true;
15 } else {
16 return false;
17 }
18 } catch (NoSuchElementException e) {
19 return false;
20 }
21 }
22 }
 1 //定位UI元素
2 public WebElement getElementBy(String elementType,String expression){
3 switch (elementType) {
4 case "xpath":
5 WebElement xpathelement = driver.findElement(By.xpath(expression));
6 return xpathelement;
7 case "id":
8 WebElement idelement = driver.findElement(By.id(expression));
9 return idelement;
10 case "className":
11 WebElement classNameelement = driver.findElement(By.className(expression));
12 return classNameelement;
13 case "linktext":
14 WebElement linktextelement = driver.findElement(By.linkText(expression));
15 return linktextelement;
16 case "name":
17 WebElement nameelement = driver.findElement(By.name(expression));
18 return nameelement;
19 case "partialLinkText":
20 WebElement partialLinkTextelement = driver.findElement(By.partialLinkText(expression));
21 return partialLinkTextelement;
22 case "cssSelector":
23 WebElement cssSelectorelement = driver.findElement(By.cssSelector(expression));
24 return cssSelectorelement;
25 default:
26 WebElement element = driver.findElement(By.xpath(expression));
27 return element;
28
29 }
30 }