改了Lead后遇到OPA的test failure:

问题的表现是我们的test code里点了cancel button之后,再点Add button,这行语句报错:在dialog里找不到这个期望的product

我会把这个问题的分析思路写到github上。

找不到item的原因是因为dialog根本就没有render-> dialog render是通过fragment.open实现的。
在引起OPA fail的上一行语句,add button会call Dialog.open,但是此时open没有真正执行,因为line 415就已经返回了。

[外链图片转存失败(img-YJw9CIAP-1568814912233)(https://user-images.githubusercontent.com/5669954/32261668-10062408-bf0b-11e7-8ccd-aec1510a3260.png)]
为什么之前Cancel button已经调用了Popup.close,但是 随后Open的时候isOpen仍然返回true?

Debug dialog的close方法就能得到答案:oPopup.close只会将状态置为CLOSING, 然后用延时操作将真正的close动作fnClose放在210毫秒之后执行:

[外链图片转存失败(img-Vy4zVc0z-1568814912234)(https://user-images.githubusercontent.com/5669954/32261671-10d4ea0e-bf0b-11e7-99f0-47f96cd17ad9.png)]
只有在210毫秒之后,popup的bOpen才会置为false,状态才会置为CLOSED. 但是我们随后的Add button click发生在这210毫秒之前,因此此时dialog的bOpen还为true,因此第二次Add button的执行并不能打开Dialog。

[外链图片转存失败(img-UI2ofEti-1568814912235)(https://user-images.githubusercontent.com/5669954/32261672-11094312-bf0b-11e7-846b-1d83198a59a0.png)]

Solution

第一种改法:
Product.js 做如下修改,这样每次点击add button会生成新的Dialog instance,避免了share同一个instance导致的问题。每次对oAddProductsFragment 赋上新的instance,之前的instance引用计数为0会被浏览器自动回收,不会出现内存泄露。我们Lead 代码里也没有任何地方需要显式通过”addProducts” id来引用这个dialog,所以这个改法可行。

[外链图片转存失败(img-CoZLlwqZ-1568814912235)(https://user-images.githubusercontent.com/5669954/32261673-113cd204-bf0b-11e7-8901-ac865e13fca1.png)]
我测试通过:

[外链图片转存失败(img-1IoENtgO-1568814912236)(https://user-images.githubusercontent.com/5669954/32261674-1171cdce-bf0b-11e7-892f-c1340ec8af75.png)]
第二种改法:

[外链图片转存失败(img-5mHhv4wI-1568814912236)(https://user-images.githubusercontent.com/5669954/32261660-0e92c2a2-bf0b-11e7-9719-e3c70c16c630.png)]
在open前面加上判断,抢先把210毫秒之后才会被修改的标志位提前由我们的application 代码自己改掉,这样之后的open能够成功。
但是这样做破坏了UI5的dialog.open和dialog.close的封装性,这些internal的属性bOpen和eOpenState UI5并不想让application touch,将来UI5升到新的版本随时可能修改,而且我也没试过Jenkins build会不会出错。所以这种做法技术可以但不能用在生产代码里。

第三种改法:
Debug dialog的close方法发现里面有个分支,如果传入的duration 为0,则真正做close的动作不通过animation来实现,而是立即执行fnClosed。
这种改法也能解决问题,但这样一来就相当于为了test 能通过而adapt了应用的UI behavior,感觉有点本末倒置。

[外链图片转存失败(img-1SkP7QOl-1568814912237)(https://user-images.githubusercontent.com/5669954/32261661-0ec950ce-bf0b-11e7-9d24-db9ed2440d1f.png)]
第四种改法:

以上三种方法都需要修改我们的应用代码。我在想有没有一种方法能够只修改OPA 代码,也能让测试通过。

Sent: Friday, 8 July, 2016 2:25 PM

UI5里的cancel点了之后的动画效果是用jQuery的animation实现的,代码里写死的动画效果的duration是210毫秒。

如果用这种解法,我还是能重用dialog fragment instance,只需要用dialog的API setDuration把close的animation设为0,这样close就没有动画效果了。

附件是延时为210毫秒和0毫秒的cancel 效果,大家看看肉眼能不能看出差别。
第四种解法的思路很简单,既然dialog的cancel是duration 210毫秒的动画效果,那么OPA代码里我只要保证OK button的点击是在这个cancel动画结束之后再执行就行了。用setTimeout将这个点击事件加到queue里,300毫秒后执行。

这种方法只用改OPA代码,可以作为最后的solution,现在OPA就能过了。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

Solution for Lead OPA test error ( add button clicked after cancel button )相关推荐

  1. why My Lead OPA test add Lead fails

    When you perform OPA test for my lead application, test case "add Lead" via this url: It w ...

  2. HTML button 和 input type=“button”的区别 / input type=submit 和button的区别

    HTML <button> 和 input type="button"的区别: 1. <button>标签里可以放文本图片等内容,与<input> ...

  3. html button onclick 列表,HTML Button.onclick 事件汇总

    HTML Button.onclick 事件汇总 οnclick="document.all.WebBrowser.ExecWB( 1,1)" type="button& ...

  4. java button jbutton_java程序将Button改成JButton,该如何改?

    (出现Accessrestriction:Thetype'JButton'isnotAPI(restrictiononrequiredlibrary'C:\ProgramFiles\Java\jre1 ...

  5. win32 直接申请button,后期修改button为圆角矩形窗口

    因为这个问题,我改了一个多星期吧.直接申请的时候在create里面直接写,申请成功且运行以后,button是一个矩形,有菱角,我们大多数看到的矩形都是圆角的.那我们该如何做呢. 首先:很重要的是你要知 ...

  6. button 与 input type=button 的区别【2012/07/23】

    <button>标签定义按钮.其内部可以放置内容(文本或者图像),这也是它与input创建按钮的不同之处. <button> 控件 与 <input type=" ...

  7. html的 button点击事件无效,InfoWindow里面加button,监听button点击事件无效 求解啊...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 点击infoWindw中的button按钮,无效果: 覆盖默认的dom结构 html, body, #container { width: 100%; h ...

  8. 解析button和input type=”button”的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  9. button组件 untiy_Unity自定义Button组件Transition

    Unity自带的Button组件有三种不同的Transition(过渡)选项,分别是None, ColorTint, SpriteSwap, Animation.现在想自定义其他功能,比如在不同的状态 ...

最新文章

  1. 测试开发板与主机之间通过串口收发数据(uart.c/uart.h )
  2. 赠书 | 熵的实际应用,赌场和金融圈最著名的一个数学公式
  3. 转如何在Sublime Text 2里增加编辑运行java功能
  4. kubernetes1.8.4 安装指南 -- 7. kubernetes node安装
  5. 基于时空相关属性模型的公交到站时间预测算法
  6. 华为向全球发布AI数据库、分布式存储,跑分轻松拿世界第一
  7. Android 学习笔记 Service服务与远程通信...(AIDL)
  8. 笨办法学python 3 48题_附录练习 8-10 笨办法学Python3
  9. 今天起改用mac的marsedit写博
  10. pg批量插入_PG语法解剖--基本sql语句用法入门
  11. MySQL下载安装与配置详细教程
  12. 2015年两化融合管理体系贯标试点企业
  13. 免费好用的虚拟服务器,六大免费好用的虚拟主机管理系统
  14. 计算机中级培训感言,计算机中级培训培训感言
  15. C语言二叉树非递归遍历详解,C语言实现二叉树的递归遍历和非递归遍历
  16. pinyin4j获取汉字正确的全拼和简拼(解决多音字问题)
  17. linux cat命令什么意思
  18. 专访杨翰深先生 | Mockplus企业版为什么能获得贵州银行的青睐?
  19. 流水线效率的计算公式计算机,[转载]生产效率计算公式
  20. 控制面板里卸载软件的入口注册表项

热门文章

  1. 将图片序列化和反序列化
  2. HEOI 2017 游记
  3. mysql集群安装指南
  4. C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考...
  5. Javascript的原型链图
  6. C++中关于类中常数静态成员初始化的问题
  7. Gradle 工具的源码研究
  8. 搭建 springMVC 框架
  9. ElasticSearch2.3.5源码研究(一)
  10. Django(part7)--请求及HttpRequest对象