• 我所喜欢的 PageModel at 2016年05月23日

    #19 楼 @quqing 嗯,很合理。我手里就一台机器。。我也没办法。 那你如果要在 Firefox 上并发多个任务,怎么弄?

  • 我所喜欢的 PageModel at 2016年05月23日

    #17 楼 @quqing 你一共有多少台机器。

  • 我所喜欢的 PageModel at 2016年05月23日

    #15 楼 @quqing 你例举一个业务场景来说说看吧。 我是一个线程对应一个 node。我觉得什么合适什么不合适还是看具体的业务场景和公司产品的情况吧。

  • 我所喜欢的 PageModel at 2016年05月23日

    #13 楼 @quqing 我觉得这是两个问题。首先一次执行,启动一个 node,相当于一个 WebDriver A,那么这个 driver A 肯定是独立的,再启动一个 driver B 不会对 A 构成影响; 其次,你说的一个 driver 打开多个浏览器窗口,取 set 遍历到你想要的就行了哇
    Set set = driver.getWindowHandles();

  • 我所喜欢的 PageModel at 2016年05月23日

    #10 楼 @quqing 相当于一个实例对应 Grid 中一个 node. 比如你启动 40 个 node,互相之间是完全没瓜葛的。

  • 我所喜欢的 PageModel at 2016年05月23日

    #10 楼 @quqing 多个实例多个 driver 哦

  • 我所喜欢的 PageModel at 2016年05月23日

    #5 楼 @watman Pagefactory+findBy 我也考虑过,挺方便适用,但是用注解描述查找路径只能写死在代码里,维护的时候可能会困难一些。

  • 我所喜欢的 PageModel at 2016年05月23日

    #4 楼 @ycwdaaaa

    // 如果是调用公共方法,则不用初始化任何page.页面方法才初始化
          if (!current.getPageObject().equals("BasePage")) {
              //这里就是通过反射去调用刚才的初始化方法了,参数太多,反正就是用数据去初始化Page.
              Reflections.invokeMethod(o, "initPage", new Class[] {
                      Integer.class, XPathService.class, String.class, String.class, Boolean.class},
                      new Object[] { pid, xps, current.getKeyword(), judgeSite() , isMobile});
          }
    

    initPage 上面有提到,在运行的时候会根据传入的页面模型 ID 去初始化。

    //这里埋下伏笔,总之我取到了我当前操作所需要初始化的所有fileds
            List<String> workingElements = Reflections.getUsedFiledsName(
                    this.getClass(), allRequiredData.keyword);
    

    getUsedFiledsNames 上面也有提到。就是取 ContainsElements 的列表的。

    getUsedFiledsNames 我没写出来,也就是简单的用注解取一个元素字符串的 List。 这个方法大概是这样:

    public static List<String> getUsedFiledsName(Class clazz, String methodName) {
    
            List<String> elements = new ArrayList<String>();
    
            Method[] methods = clazz.getMethods();
    
            for(int i=0;  i < methods.length; i++) {
                if(methods[i].getName().equals(methodName)) {
                    ContainsElements ce = methods[i].getAnnotation(ContainsElements.class);
    
                    if(ce == null) {
                        break;
                    }
    
                    String[] es = ce.values();
    
                    for(int j = 0; j < es.length; j++) {
                        elements.add(es[j]);
                    }
                }
            }
            return elements;
        }
    }
    
  • 我所喜欢的 PageModel at 2016年05月23日

    #3 楼 @lihuazhang 数据全在 DB,用 Web 界面维护的。数据这一块我这也没什么新意,放 DB 也好,xml 也好,excel 也好,最终都是拿来用,而我在存储,组织或者提取数据方面都是中规中矩的东西,也没什么设计,最多做点类似项目全局变量的玩意儿增加一下数据的复用。比如我要执行用例 A,就根据 A 的 id 去 mysql 数据库取他的页面模型 (Homepage),操作关键字 (click_button),取参数(由于我们是多语言的,所以某些时候取参数要过一下语言包)。提取后封装,然后拿给 MainRunner 用就行。用 Web 界面有一定好处,比如封装 Page 后,可以直观的在前端展示有哪些页面,做一个可以过滤筛选的下拉;又比如可以顺便展示测试报告,截图或者统计等。

  • 我所喜欢的 PageModel at 2016年05月23日

    #2 楼 @quqing 我想先听一下,如果不是单例,会造成怎样的不稳定?目前我还未遇到不稳定的情况,单机器并发 Case 暂时还没出过问题。

  • 一周的工作忙完了,静静的喝杯茶再来读读这个系列,看能否有所收获

  • 执行用例的代码在哪呢? 另外我觉得你可以把 Cell FI = sheet0.getCell(5, i) 类似这种的 5 6 7 8 列编号拉出来管理,比如 public static Integer COLUMN_FI = 5; //说明这是什么. 这样如果你 EXCEL 结构有调整也方便一些。

  • delicious! 这个系列要写下去,持续关注中。

  • 大话设计模式

  • 图片看不清楚。 不过简单的那几个断言语句绝对满足不了接口测试响应验证的需求

  • Selenium2 框架概述 at 2016年05月05日

    #5 楼 @chenhengjie123 最简单的 结合起来,就是用 webdriver + grid + jenkins 实现分布式持续集成

  • #4 楼 @gaopeng1106 不止爬的 topics, 所有页面都 fetch. 等我完善了代码贴出来给您评估评估

  • #3 楼 @seveniruby 我没有添加! 我预计如果 appium 和 robotium 加进来也无法扭曲这个结果,哈哈哈 。 话说还可以有哪些关键词,可以加进来,下次彻底趴一趴我们都在做些什么

  • #14 楼 @xushizhao 哎呀老徐,我也就是来打个圆场。你自然是没说错,我的意思是楼主确实理解有偏差。别较真了。

  • #8 楼 @xushizhao 别较真了。。他的意思是异常 catch 后打了个堆栈就是 “抛出” 了。 你理解的抛出和他理解的不同而已。 他只是想打出来看一看,不作处理

  • #6 楼 @mengfeiyang 你这说的那么悬乎,这玩意儿怎么就影响到搞培训的收入了。。

  • app 登录自动化 at 2016年04月07日

    找开发人员配合,设法获取验证码呗

  • 一起来聊聊测试用例设计 at 2016年04月06日

    #2 楼 @lihuazhang 1,10 和 5,50 有何区别。。

  • 一起来聊聊测试用例设计 at 2016年04月06日

    一起来聊聊 XXX,这是潮流吗

  • 一起来聊聊业务测试 at 2016年04月05日

    我估计很多社区里的人都和楼主有相似的感觉——当得到一个测试任务后,总爱对问题进行深度优先遍历,究其开发原理,想不通睡不着,反而忽视了更重要的广度优先遍历,覆盖业务逻辑。否定后者其实就是否定自己的存在啊!