| 
 问题描述:wap版支付成功后,跳转到支付成功页,查找的元素已出现,如图的:元素1,元素2,但是提示查找的元素超时,失败,并且每到这个页面都会报页面超时,不能查找到页面元素  
    
   
原始代码:  
 
 try{
op.actionSingleClick("PlaceYourOrderBtn");       //点击确认提交支付按钮 
Page.pause(4);                 
} catch (Exception e) {
e.printStackTrace();
}          
String successMsg1 = op.loopGetElementText("successMsg1", 10, 60); .//获取支付成功提示
Log.logInfo("支付成功提示为:"+successMsg1);. 
  
actionSingleClick内容:  
 
 public void actionSingleClick(String elementStr) throws Exception {
      boolean res = false;
      boolean printFlag = true;
      int loopTimes = 3;
      for (int i = 1; i <= loopTimes; i++) {
         try {
            WebElement element = MyWebDriverWait2(elementStr, explicitWaitTimeoutLoop, false, false);
            action.moveToElement(element).click().perform();
            Thread.sleep(1000);
            res = true;
            break;
         } catch (Exception e) {
            if (printFlag) {
                e.printStackTrace();
                printFlag = false;
            }
            Log.logWarn("模拟鼠标操作时发生异常(" + GetMethodName() + ").");
         }
      }
      if (!res) {
         Log.logWarn("连续 " + loopTimes + " times,模拟鼠标操作发生异常.");
         throw new RetryException();
      }
   } 
  
   
执行后报错提示如下:  
timeout: cannot determine loading status  
连续 3 times,模拟鼠标操作发生异常.  
提示在点击确认按钮“PlaceYourOrderBtn”就已经出错,但是错误截图是在已支付成功的页面  
本地测试,发现控件有时能查找到,有时查找不到,原因能查找到的元素时,顶部的进度条已完成,而没有查找到控件时,顶部进度条,一直在是80%呈未加载完成的状态,类似如图  
    
   
思路方案:  
方案1,使用selenium的隐时页面等待:        
 
 try{
driver.manage().timeouts().implicitlyWait(25, TimeUnit.SECONDS); 
op.actionSingleClick("PlaceYourOrderBtn");       //点击确认提交支付按钮 
Page.pause(4);                 
} catch (Exception e) {
e.printStackTrace();
}                  
String successMsg1 = op.loopGetElementText("successMsg1", 10, 60);
Log.logInfo("支付成功提示为:"+successMsg1);.//获取支付成功提示 
  
   
意思是:总共等待25秒, 如果25秒后,元素还不存在,就会抛出异常  org.openqa.selenium.NoSuchElementException  
隐式等待相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。  
发现这个隐时等待没用,设置了足够的时间还是没有找到,不能解决问题,  
   
方案2:想通过页面的加载状态,页面在规定时间内加载不成功,就在刷新  
 
 try {
driver.manage().timeouts().pageLoadTimeout(60,TimeUnit.SECONDS)         
op.actionSingleClick("PlaceYourOrderBtn");       //点击确认提交支付按钮 
Page.pause(4);                 
} catch (Exception e) {
e.printStackTrace();
}                  
String successMsg1 = op.loopGetElementText("successMsg1", 10, 60);
Log.logInfo("支付成功提示为:"+successMsg1);.//获取支付成功提示 
  
意思是:页面加载超过60S报错,并重新进行页面刷新  
想当页面加载超过60S,报错,并重新刷新页面,当时设置过刷新页面3次,这个偶尔好使,但网络慢时,刷新3次或者4次都不管用  
   
方案3:显示等待  
 
 try{
op.actionSingleClick("PlaceYourOrderBtn");       //点击确认提交支付按钮 
Page.pause(4);                 
} catch (Exception e) {
Log.logInfo("点击提交按钮,页面超时了,但是页面已经显示了支付成功页,继续执行下一步");}          
try {                   
         wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#mainWrap> div.msg-page > p")));//先判断是否存在,存在就打印下面一句,不存在就报错
                    Log.logInfo("成功进入支付成功页面!!!");
                   } catch (Exception e) {
                            e.printStackTrace();
                            Log.logError("进入支付成功页面失败!!!,不进行下一步操作");
                   }
String successMsg1 = op.loopGetElementText("successMsg1", 10, 60);
Log.logInfo("支付成功提示语为:"+successMsg1);
. 
  
当页面加载很慢时,使用显示等待:等到需要操作的那个元素加载成功之后就直接操作这个元素,不需要等待其他元素的加载  
意思是:当点击按钮后跳转到另外一个页面,页面还是在加载中,默认是60s,页面加载已超时,但是页面上已经出现了需要查找的控件,等待报错后,还会继续执行,如果成功页面的提示在10s内有这个元素,继续执行下一步,就解决页面没有加载完,找不到元素的问题  
 
  
   
   |   等待的条件   |  
     WebDriver方法   |  
    
   
   |   页面元素是否在页面上可用和可被单击   |  
     elementToBeClickable(By locator)   |  
    
   
   |   页面元素处于被选中状态   |  
     elementToBeSelected(WebElement element)   |  
    
   
   |   页面元素在页面中存在   |  
     presenceOfElementLocated(By locator)   |  
    
   
   |   在页面元素中是否包含特定的文本   |  
     textToBePresentInElement(By locator)   |  
    
   
   |   页面元素值   |  
     textToBePresentInElementValue(By locator, java.lang.String text)   |  
    
   
   |   标题 (title)   |  
     titleContains(java.lang.String title)   |  
    
  
  
   
     |