• 我所喜欢的 PageModel at June 16, 2016

    很多人喜欢写框架,喜欢所谓配置和代码分离,事实上页面元素本来就应该和PageObject对应,这种对应关系越近,理解就越容易,而且修改代码有ide的navigation,维护代码有git的branch。就好比写个orm框架,数据库字段的配置还要存到数据库,大部分时候,真的好累

  • 小心而彻底的真实
    个人的危机还是若隐若现.时刻像一个定时炸弹
    这其中其实并没有自己的贡献. 觉得也有些失落

  • Appium Wrapper for Java at September 16, 2015

    如今java-client 3.2也提供了类似的服务https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/service/local/AppiumDriverLocalService.java

    使用builder模式api更友好,但在kill process方便更相信appium本身

  • 创业公司->淘宝 ->创业公司->携程 大公司相对少的努力可以获得比小公司多的待遇上回报,可是为何还想去创业公司,就是内心想燃烧的冲动,不想就这样的活,可是到了小公司又并没有改变什么,相反是各种技术人遇到的痛苦,就这样来回奔波,然后,一种情怀吧

  • #23楼 @sunflower
    如果用nodejs npm 安装appium,chromedriver是被包含进去的,不会直接去chromedriver站点下载

  • Device 管理队列 at July 20, 2015

    #6楼 @springs412
    我的几个帖子,其实就是和appium/selenium grid的方式相反了,通过在一台node上,并行启动appium,让testng去管理。当时是鉴于appium的不稳定,所以这样做。

    1. gird各节点状态,selenium grid 应该可以获取到,或者只是投递到hub,hub负责分发。
    2. 我的方式是case级别,或suite级别重启appium。但对于grid,显然不能经常重启。selenium grid就有个grid-extra 来协助管理状态.显然应该有个device的管家,来做各种杂事。
    3. 我的方式是在每个node上运行一个服务,来接收adb命令,然后发送到特定device,但如果深入研究adb,可能有更直接的方式。
  • 浅谈 iOS 版本号 at June 25, 2015

    比较简单,但正是区别优秀与一般的好知识,好文

  • #16楼 @ganyunxiao
    开始我也用的chimpchat 后来发现还是ddmlib更通用,功能也更全,忘记了,貌似chimpchat是基于ddmlib

  • #11楼 @testly
    一般ddmlib 对于一个app会是一个package 对应一个progress,然后又对应的Client监控,每个进程可以获取相应的内存信息,一直想做这块,但最近没有太多时间了

    com.android.ddmlib.Client 这个类,对应一个Android中的VM监控,可以获取heap、Thread、等信息,甚至可以做debug

  • #10楼 @xxfcxx 需要配置一下ANDROID_HOME Android SDK目录。
    确保能下下来仓库jar 默认的mavenCentral通常是下载不成功的,如果没有代理。

    repositories {
    maven {
    url 'http://maven.oschina.net/content/groups/public/'
    }
    }
  • #7楼 @testly
    应该可以,adt/as 支持的应该都可以做到,比如做一个代码断点调试的功能

  • #7楼 @xcgspring 看了一下写的很赞!

    1. 关于学习经验问题,开发也遇到类似的情况,但开发的思维是继续学习,然后事情变的更加简单。
    2. PageObject既然是模式,只要有一个人懂了,就可以复制传递下去,因为是模式,就是可以照模画的
    3. 关于xml语言,显然这些年的沉淀,开始回归代码,有些复杂绕不过去,直面它反而简单。直接使用Python或某一种平台语言抽象出移动自动化的dsl脚本,其实需要知道的知识极其的少。

    这也正是selenium中的最佳实践推荐
    https://seleniumhq.github.io/docs/best.html#best_practices

  • #2楼 @chenhengjie123 locale改为en_US了,应该没编码问题,至于中文...其实方法名称就差不多了

  • Appium Wrapper for Java at March 24, 2015

    appium 和设备之间没有什么直接的关系。我们一台电脑启动两个appium instance, 分别连一个device没有问题。有问题也是appium本身对多进程的支持小bug,但不影响你问的问题

  • .....最简单的方式,把一个appium server实例看成一个process,关闭它就好了。如果直接使用nodejs来启停,有对应的stop或unbind方法。如果使用其他语言,就按照操作process方式。java语言可以参考http://testerhome.com/topics/1864

  • #5楼 @chenhengjie123 恩,第一遍看的不够细。我是直接把下载chromedriver那一段,人工做了。

  • 如果需要build android chrome的,chromedriver 如果没代理也下载不下来,需要调整下reset.sh

  • #5楼 @zhubaitian 工作中用不到mokeyrunner,看了你几篇原理分析部分,分析的很透彻,很赞。期望下面出现你要找的人

  • 支持一下! mokeyrunner 似乎基于ddmlib/chimpchat 我倒是对ddmlib源码比较熟悉一点,可以共同学习。

  • Lazy 这个想法很好,这也正是PageObjectFactory本身帮我们做了的事情。PageObject中的元素本身就是延迟加载,并且可以使用查询cache
    http://relevantcodes.com/pageobjects-and-pagefactory-design-patterns-in-selenium/#CacheLookup

    如果我们对第三方框架多了解一些,很多美好的想法,都已经实现了。这也正是在ctrip比较难过的事情,很多框架各种封装,所谓简单,都已经改变了一些标准和第三方框架本身的设计,面目全非,经不起推敲,而繁琐。

  • 通过ddmlib获取也可以,代码也容易维护,升级。我基于ddmlib本想封装一下,可发现原生的也不那么难用...
    https://github.com/cosysoft/device

  • Appium Wrapper for Java at February 04, 2015

    不需要绝对正确,端口范围很大,不会出问题就行

    /**
    * A simple rather userful port finder
    *
    * @author ctrip
    *
    */

    public class AvailablePortFinder {
    public static final int MIN_PORT_NUMBER = 40000;
    public static final int MAX_PORT_NUMBER = 60000;
    private static int current = MIN_PORT_NUMBER;

    private AvailablePortFinder() {
    }
    public synchronized static int getNextAvailable() {
    if (++current == MAX_PORT_NUMBER) {
    current = MIN_PORT_NUMBER;
    }
    return getNextAvailable(current);
    }
    private synchronized static int getNextAvailable(int fromPort) {
    if ((fromPort < MIN_PORT_NUMBER) || (fromPort > MAX_PORT_NUMBER)) {
    throw new IllegalArgumentException("Invalid start port: "
    + fromPort);
    }

    for (int i = fromPort; i <= MAX_PORT_NUMBER; i++) {
    if (available(i)) {
    return i;
    }
    current++;
    }

    throw new NoSuchElementException("Could not find an available port "
    + "above " + fromPort);
    }
    private static boolean available(int port) {
    if ((port < MIN_PORT_NUMBER) || (port > MAX_PORT_NUMBER)) {
    throw new IllegalArgumentException("Invalid start port: " + port);
    }

    ServerSocket ss = null;
    DatagramSocket ds = null;
    try {
    ss = new ServerSocket(port);
    ss.setReuseAddress(true);
    ds = new DatagramSocket(port);
    ds.setReuseAddress(true);
    return true;
    } catch (IOException e) {
    } finally {
    if (ds != null) {
    ds.close();
    }

    if (ss != null) {
    try {
    ss.close();
    } catch (IOException e) {
    /* should not be thrown */
    }
    }
    }

    return false;
    }

    }
  • Appium Wrapper for Java at February 03, 2015

    #10楼 @anikikun AvailablePortFinder根据Socket绑定判断port是否可用,每次都会自增1,这个port可用是很大的一个范围,使用AtomicInteger不会出现并发问题。其实这个判断端口的方法,Selenium中有个比较靠谱的,具体你找找吧,研究Appium顺便把WebDriver API一并看了

  • Appium Wrapper for Java at January 21, 2015

    #3楼 @lihuazhang 恩我得先问问老大。可以先写个ppt什么的,其实Appium一路走来还是蛮苦的