Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 692|回复: 0

selenium显示等待解决浏览器未加载完成查找控件的问题

[复制链接]
  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 799 天

    [LV.10]以坛为家III

    2050

    主题

    2108

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    725076
    发表于 2021-4-18 21:34:29 | 显示全部楼层 |阅读模式

    问题描述: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)

     

       

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-2 16:40 , Processed in 3.107754 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表