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

selenium显示等待解决浏览器未加载完成查找控件的问题的更多相关文章

  1. ASP.NET MVC中加载WebForms用户控件(.ascx)

    原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...

  2. asp.net动态加载ascx用户控件

    原文:asp.net动态加载ascx用户控件 在主aspx/ascx文件中,将目标ascx1,ascx2控件拖拉到其页面中,然后删除,目的是要生成:Register 代码,然后在主文件中定义DIV或T ...

  3. 文本溢出显示省略号,CSS未加载时a标签仍可用处理方法

    一.文本溢出打点 (1)单行文本 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; (2)多行文本 overflow : h ...

  4. 首次加载进来DEV控件列表第一行颜色总是不对,后台代码显示的数据正确

    1:行改变的颜色正确的颜色: 1.1颜色效果如下图: 1.2:设置行改变颜色: 2:结果首次加载第一行颜色为: 3:解决方案: 3.1 :Views-->OptionsSelection --& ...

  5. 将OpenCV捕获的摄像头加载到picture控件中

    CRect rect; CStatic* pStc; CDC* pDC; HDC hDC; pStc = (CStatic*)GetDlgItem(IDC_CAM);//IDC_CAM是Picture ...

  6. ifc构件加载到树形控件中

    void IfcTreeWidget::setParentCheckState(QTreeWidgetItem *item) { if(!item) return; ; int childCount ...

  7. 解决ListView异步加载图片错乱问题 .

    发一个异步图片加载控件.网上也有大把的异步网络加载图片的控件,但是有一个问题,异步加载会造成列表中的图片混乱,因为列表的每一项的View都可能被重用,异步加载的时候多个异步线程引用到了同一个View将 ...

  8. Selenium截屏 图片未加载的问题解决--【懒加载】

    需求: 截屏后转PDF. 问题: selenium截屏后,图片未加载 如下图: 原因: 网站使用了懒加载技术:只有在浏览器中纵向滚动条滚动到指定的位置时,页面的元素才会被动态加载. 什么是图片懒加载? ...

  9. js图片未加载完显示loading效果

    <html> <title>js图片未加载完显示loading效果</title> <body> <style> img{float:lef ...

随机推荐

  1. PS2018学习笔记(19-24节)

    19-随心所欲变换 # 本节知识点 自由变换 移动变换 旋转变换 斜切变换 变形变换 扭曲变换 透视变换 # 本节段落表 自由变换命令 变换中的移动 再次变换命令 对象缩放 旋转 斜切 变形 扭曲 透 ...

  2. jQuery之ajax() 参数

  3. GoWeb开发_Iris框架讲解(四):Iris框架设置操作

    路由组的使用 在实际开发中,我们通常都是按照模块进行开发,同一模块的不同接口url往往是最后的一级url不同,具有相同的前缀url.因此,我们期望在后台开发中,可以按照模块来进行处理我们的请求,对于这 ...

  4. bzoj3876: [Ahoi2014&Jsoi2014]支线剧情(上下界费用流)

    传送门 一道题让我又要学可行流又要学zkw费用流…… 考虑一下,原题可以转化为一个有向图,每次走一条路径,把每一条边都至少覆盖一次,求最小代价 因为一条边每走过一次,就要付出一次代价 那不就是费用流了 ...

  5. java整理(三)

    1.继承性:继承已有的功能.使用extends关键字.class  子类   extends  父类{} 子类又被称为派生类,父类又被称为超类. 继承的限制: 1.java中,不允许多重继承,即一个子 ...

  6. 多实例:MySQL系列之二

    MySQL的多实例配置 ​ 在一台物理机中需要多个测试环境,那么就需要用到了搭建数据库的多个实例,多个实例的意思就是运行多份程序,实例与实例之间没有影响.要注意监听的端口需要不同. 环境:CentOS ...

  7. shell学习(14)- who

    Linux who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID.使用的终端机.从哪边连上来的.上线时间.呆滞时间.CPU 使用量.动作等等. 使用权限:所有使用者都可使用. 语 ...

  8. QT的学习

    背景 最近正忙着做一个项目,由于之前对面向对象编程了解的非常少,所以导致项目的代码有很多不太清楚:看到代码的时候整个人是懵的.所以在国庆期间,结合着大神的博客看了一下面向对象编程,并学习了开发GUI应 ...

  9. aspnetcore的中间件

    Run会终止中间件继续传递 app.Run(new RequestDelegate(async context => { await Task.Run(() => { context.Re ...

  10. Java文件与io——NewIO

    为啥要使用NIO? NIO的创建目的是为了让JAVA程序员可以实现高速I/O而无需编写自定义的本机代码.NIO将最耗时的I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度 流与快的 ...