• 第八期_shell 实战_20190120 at 2019年01月20日

    看了下调查结果,有部分同学反映没学会,下周我找个时间给大家加课。重点讲下Linux三剑客的语法和应用场景。

  • 第八期_shell 实战_20190120 at 2019年01月20日

    作业3
    head -10000 /tmp/nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5

  • 第八期_shell 实战_20190120 at 2019年01月20日

    以上答案全错

    • grep -E " 404 | 500 " /tmp/nginx.log
    • awk '$9=="404"' /tmp/nginx.log
    • junit的用例顺序,参考之前的课程视频。suite的顺序、测试用例自身的顺序、继承关系下用例初始化顺序
    • 自选按钮定位偏倚是以为自选是动态加载的,所以需要定位多次,只有前后两次定位出来的配置是不变的,才表示页面加载完成
    • toast一般会在弹框之前。不了解你的场景,可以截图举个例子。
  • 查log,看下pm命令安装的命令参数。如果不是命令的问题,那么只能使用我之前提到的弹框解决的办法。另外也可以看下pm是否可以追加权限,这个也需要adb的hack

  • 基本语法你自己解决,或者找python的助教。

  • ocr技术是成熟的,使用标准的库就可以了。但是最好是封装为restful服务。把图片发给自己的服务器,然后服务器返回ocr识别出来的每个对象的坐标和ocr识别出来的文本内容。 其他的深度学习识别突变也是可以这样做。

    另外百度、腾讯、google都实现了这类的api服务,可以直接调用。

  • appium这块设计的不理想,本来是自动安装的。如果想不自动安装,你需要修改appium,或者对adb做一些hack

  • 正常的 ,appium后面会自动安装

    • 确保元素加载完成
    • 确保js执行完成
    • 如果点击仍然不生效,就得找根本原因

    核心还是要找到原因,才能做对应的解决方案。

  • 下节课内容

  • 静态阅读

    • 找入门
    • 调用链分析
    • 通读所有的类文件和api用途
    • 分析类与类之间的调用关系

    动态分析

    • 调试
    • trace调用链和参数传递
  • AndroidDriver=AppiumDriver + 十多种Android api
    AppiumDriver=RemoteWebDriver + ComparesImages
    RemoteWebDriver=WebDriver + 。。。
    ChromeDriver=WebDriver+。。。

    AndroidElement=MobileElement+FindsByAndroidUIAutomator
    MobileElement=RemoteWebElement+FindsByClassName
    RemoteWebElement=WebElement+FindsById

  • 雪球可以在任意时刻都会莫名奇妙的弹出一个”给好评”的提示。所以你的自动化如果想更稳定,你不能在特定的时间去判断弹框是否存在。

    任意时刻的弹框

    自定义find方法,伪代码如下

    static WebElement find(By locator){
    try{
    return Driver.getCurrentDriver().findElement(locator);
    }catch (Exception e){
    Driver.getCurrentDriver().findElement(text("下次再说")).click();
    return Driver.getCurrentDriver().findElement(locator);
    }
    }

    另外一个办法就是 uiautomator本身是有watcher机制的,改造默认的Uiautomator2-server,支持事件监听和处理

    权限弹框

    • autoGrantPermissions: true

    安装app的弹框

    • adb install + adb shell uiautomator dump + adb shell input
    • appium先启动,不要安装任何的apk,然后在执行的课程中,调用installApp api
  • 挺勤奋的小伙子,加油。如果你在甲方其实可以成长的更快,尽量去甲方吧。可以把简历给我,我给你推荐工作

  • 是的,一般都会把进入各个界面的方法放到一个独立的Navigate中,里面保存了进入所有Page的方法。今天讲解的时候没带大家封装这个,怕大家跟不上。

  • 其实我是建议用java的同学尝试下kotlin,这个语言还是很棒的。他在语法上比Python还强大。
    不过选择语言是次要的,选择生态最重要。公司要用Spark、Flink,你就得老老实实的用jvm系列的语言。公司用TensorFlow就得老老实实的用Python或者Go。

  • 看下5037的端口被什么进程占用,释放就可以了。
    还有一种可能就是genymotion会默认启动adb,如果他选择错了不同位置的adb,解决办法:让genymotion使用统一的adb

  • appium --relaxed-security

    • 推荐 使用相对定位,找到父控件+百分比位置 locate(parentid, 0.5, 0.2 )
    • 不推荐 ocr
    • 截图查找
  • adb shell ps | grep uiautomator 看下是否一直存在,强行kil。 kill -9
    还有可能是有程序偷偷的自动启动Uiautomator,需要去找原因

    • 多数是兼容的
    • java client一般会表示自己支持的appium server,changgelog中有说明
    • 使用老版本的client+新版本的appium server

    appiium是兼容的,支持4.0到8.0。 automationName是会根据版本自动设置对应的driver的,4.0使用selendroid,4.4使用Uiautomator1 6.0以上使用Uiautomator2 appium会自动选择的。

    • adb shell dumpsys activity broadcasts | grep sender
    • 使用adb读取短信的db文件,估计需要root sqlite
    • ui自动化跳到短信
    • 使用独立的手机+循环读取短信+post到公共服务器
  • 广州凑齐20个人也会开,不过目前貌似广州的人有点少,我们优先考虑了深圳。

  • 你这Uiautomatorviewer是自己改造的吧。先获取父层控件的定位,然后再根据相对坐标进行定位就可以了。父窗体的坐标结合屏幕宽度的三分之一来动态计算你想要控件的坐标。这种方式通用性好,技术实现成本最低。其他的oc 图像识别也可以考虑,不过复杂了。appium的最新版本的client支持图形识别的。