• 我也是这种情况,有时候觉得好孤单啊,况且我基本都是自己一人做项目,连个能讨论的人都没有,所以我现在想走了,想换个能交流思想的组。。。

  • 真机可以用了吗?

  • 请问这个操作支持 ios10 以上的系统吗??

  • STF 框架之 minitouch 工具 at 2018年06月06日

    demo 好像出了点什么问题呢:

  • 请问 airtestIDE 的代码是开源的吗?github 上的开源代码并没有找到 ide 相关的内容呢?

  • 可能在高中时候读的励志书籍 太多了,导致现在对这种书一点兴趣都没有,反倒是对很多传记感兴趣,讲一些自己经历的书,比如李思思《有点意思》,何炅《来得及》

  • 握手

  • 2016,其实我不 6 at 2017年01月23日

    2017,把欠下的不 6,全都找回来~~

  • 点个赞!

  • #38 楼 @kasi 是在回复我的问题吗?界面对比?能否详细点呢?

  • #23 楼 @kasi @kilmer 如果是监控 android 事件,有的手机,点击返回按键,并不会返回有效的类似于 KEY_BACK 的字符,那么该如何判断点击了返回键呢?

  • 时间简史 at 2016年12月23日

    之前看过电子版的《时间简史》,这次能够借到这本书简直是我的荣幸,烧脑的书就要经常读,慢慢参透!感谢~~

  • #20 楼 @williamliuok 已加微信 🙏 🙏

  • #18 楼 @williamliuok 非常感谢您的详细回复,很受教,那么想继续追问个问题:关于无法用 back 键恢复的界面,您是怎么遍历其他按钮的呢?或者是也可以理解成,back 键直至退出 APP 了以后如何继续遍历那些为遍历的控件呢?我目前遍历后的遍历比率特别低,一些页面几乎是点击一个按钮就没再恢复了。
    感谢!

  • #14 楼 @ruru 我也想过通过 xml 文件作比较,可是 xml 比较是怎么做到的呢??

  • #11 楼 @bailin 一起玩呀~~~

  • #10 楼 @haos 太棒了,解决了我很久的困惑,感谢!我整合一下思路,如有疑问还希望能与您继续讨论~~

  • #7 楼 @haos 如果不关心 UI 更新,那就只能一路点下去,怎么进行页面回退判断呢?

  • #3 楼 @kasi 是呢,您是怎么填平这个坑的呢??

  • #2 楼 @heyniu 用控件的 id 来做严格对比吗?那万一有个微小的变化怎么处理呢?

  • #1 楼 @haos 我知道用 xpath 可以去过滤控件,但现在我可以用 uiautomator 中的函数来过滤,你说用 xpath 具体是什么思想呢??

  • 前辈能否详细讲解一下判断界面是否是新界面的过程,具体对 xml 进行了什么操作,又是如何对比的?谢谢。

  • #31 楼 @ouyang995948959 请问您是采用什么方式判断是否是新界面的,我也在做 UI 遍历测试,希望探讨一下,谢谢。

  • 您好,我的配置文件如下:
    <?xml version="1.0" encoding="UTF-8"?>

    <!--Appium 服务关键字-->

    1.4.16
    true
    false
    zh-Hans


    E:/sohuVideoMobile_6.0.2_680_20161123125646.apk
    9bb30df4
    Android
    4.4.2
    vivo Xplay3S
    com.sohu.sohuvideo
    com.sohu.sohuvideo.ui.MainActivity
    true
    true
    true

    <!--引导流 关键字驱动,引导至所需模块再开始遍历-->

    tips>>禁止 | 允许>>//android.widget.Button[@resource-id='com.huawei.systemmanager:id/btn_allow']
    <!--滑动类型设置-->
    slide>>2
    <!--点击类型设置-->
    click>>id::com.xxx.xxx:id/btnnext
    click>>id::com.xxx.xxx:id/text_home_head_login
    <!--输入类型设置-->
    click>>id::com.xxx.xxx:id/otp_tv_login_with_username
    input>>id::com.xxx.xxx:id/tv_loginAccount|13012345678
    input>>id::com.xxx.xxx:id/loginPassword|123
    click>>id::com.xxx.xxx:id/tv_login
    <!--手势密码-->
    gesture>>xpath:://android.widget.FrameLayout[@resource-id='com.xxx.xxx:id/gesture_container']//android.view.View[1]//android.widget.ImageView
    gesture>>xpath:://android.widget.FrameLayout[@resource-id='com.xxx.xxx:id/gesture_container']//android.view.View[1]//android.widget.ImageView


    <!--窗口鉴定策略,默认取前 8 个节点生成 md5-->
    8
    <!--Tab 窗口用 selected 区别,可能要多选几个节点到达-->

    专题,直播,要闻,选股>>24
    简单理财,投资,保险,贷款,信用卡>>30

    <!--窗口执行顺序 1:从上到下 (默认) 2:从下到上-->
    1
    <!--控件白名单-->

    UIAImage
    UIAButton
    UIASwitch
    UIATableCell
    UIAStaticText
    UIAPickerWheel
    UIACollectionCell
    android.widget.Button
    android.widget.ImageButton
    android.widget.TextView
    android.widget.ImageView
    android.widget.FrameLayout
    android.widget.LinearLayout


    UIATextField
    UIASearchBar
    UIASecureTextField
    android.widget.EditText

    <!--启动界面提示框,包含的关键字及操作的控件-->
    禁止 | 允许>>//android.widget.Button[@resource-id='com.huawei.systemmanager:id/btn_allow']
    <!--无需返回的列表,需配置识别窗口唯一性的内容-->

    首页
    财经快讯,我,我的订单,活期,定期

    <!--黑名单 支持 text,name,resourceId 的过滤-->

    相机
    退出登录
    如您已完成添加,请重新登录
    重新登录
    //UIAApplication[1]/UIAWindow[4]/UIAPicker[1]/UIAPickerWheel[1]

    //UIAApplication[1]/UIAWindow[1]/UIATableView[1]/UIATableCell[2]/UIACollectionView[1]/UIACollectionCell[5]


    <!--触发器 条件>>动作 支持返回,点击,手势密码解锁,延时等待-->

    拍照>>back
    相册>>back
    扫描框>>back
    分享到>>back
    我的权益>>delay->3
    选择银行>>back
    选择保险公司>>back
    检测到新版本>>back
    添加产品 | 保存>>back
    消息 | 全部>>back

    closeButton>>//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.ImageButton

    安全验证 | 立即验证 | 以后再说>>//android.widget.Button[@resource-id='xxx.xxx.xxx:id/rightBtn']

    更多解锁方式>>gesture->//android.widget.FrameLayout[@resource-id='com.xxx.xxx:id/gesture_container']//android.view.View[1]//android.widget.ImageView


    <!--过滤级别 1:clazz+text+content_desc+resourceId 2:winID+clazz+text+content_desc+resourceId 3:taskID-->
    2
    <!--退出遍历的条件:同一窗口内的停留次数-->
    10

    <!--app 日志-->

    adb -s #udid# logcat -b main -b system -b events -b radio *:D | grep xxx


    <!--Appium port-->
    4723
    <!--Appium host-->
    127.0.0.1
    <!--测试类型 1.android 2.ios 3.web-->
    1
    <!--运行模式 1.遍历模式 2.业务场景模式-->
    1
    <!--遍历深度-->
    3
    <!--截图和视频的目录-->
    /Users/mac/Desktop/png
    <!--启动 appium-->
    /Applications/Appium.app/Contents/Resources/node/bin/node /Applications/Appium.app/Contents/Resources/node_modules/appium/bin/appium.js -p #port# -bp 5760 --session-override --command-timeout 7200 --udid #udid#
    <!--遍历时间 分-->
    10
    <!--延时等待 秒-->
    3
    <!--超时 秒-->
    30

    运行时出现如下错误:
    2016-11-24 18:33:22 sys_log : [INFO] Appium Server -> http://127.0.0.1:4723/wd/h
    ub
    log4j:WARN No appenders could be found for logger (org.apache.http.client.protoc
    ol.RequestAddCookies).
    log4j:WARN Please initialize the log4j system properly.
    Exception in thread "main" org.openqa.selenium.remote.UnreachableBrowserExceptio
    n: Could not start a new session. Possible causes are invalid address of the rem
    ote server or browser start-up failure.
    Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 17:00:58'
    System info: host: 'changhe-tj', ip: '10.7.40.59', os.name: 'Windows 7', os.arch
    : 'amd64', os.version: '6.1', java.version: '1.8.0_91'
    Driver info: driver.version: AndroidDriver
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.ja
    va:665)
    at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGener
    icMobileDriver.java:43)
    at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.jav
    a:1)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriv
    er.java:249)
    at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.jav
    a:131)
    at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.jav
    a:144)
    at io.appium.java_client.DefaultGenericMobileDriver.(DefaultGeneri
    cMobileDriver.java:39)
    at io.appium.java_client.AppiumDriver.(AppiumDriver.java:69)
    at io.appium.java_client.AppiumDriver.(AppiumDriver.java:78)
    at io.appium.java_client.android.AndroidDriver.(AndroidDriver.java
    :67)
    at pers.traveler.robot.Robot.beforeTravel(Robot.java:118)
    at pers.traveler.robot.AndroidRobot.working(AndroidRobot.java:57)
    at pers.traveler.robot.Robot.working(Robot.java:163)
    at pers.traveler.robot.Robot.travel(Robot.java:202)
    at pers.traveler.test.Main.main(Main.java:21)
    Caused by: org.openqa.selenium.WebDriverException: org.apache.http.conn.HttpHost
    ConnectException: Connect to 127.0.0.1:4723 [/127.0.0.1] failed: Connection refu
    sed: connect
    Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 17:00:58'
    System info: host: 'changhe-tj', ip: '10.7.40.59', os.name: 'Windows 7', os.arch
    : 'amd64', os.version: '6.1', java.version: '1.8.0_91'
    Driver info: driver.version: AndroidDriver
    at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumComm
    andExecutor.java:76)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.ja
    va:644)
    ... 15 more
    Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:4
    723 [/127.0.0.1] failed: Connection refused: connect
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect
    (DefaultHttpClientConnectionOperator.java:151)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(
    PoolingHttpClientConnectionManager.java:353)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClie
    ntExec.java:380)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.
    java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java
    :184)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java
    :110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttp
    Client.java:184)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttp
    Client.java:71)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttp
    Client.java:55)
    at org.openqa.selenium.remote.internal.ApacheHttpClient.fallBackExecute(
    ApacheHttpClient.java:144)
    at org.openqa.selenium.remote.internal.ApacheHttpClient.execute(ApacheHt
    tpClient.java:90)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExe
    cutor.java:142)
    at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumComm
    andExecutor.java:64)
    ... 16 more
    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocke
    t(PlainConnectionSocketFactory.java:74)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect
    (DefaultHttpClientConnectionOperator.java:134)
    ... 29 more
    2016-11-24 18:33:32 sys_log : [INFO] 遍历测试持续时间 -> 40.00s
    2016-11-24 18:33:42 sys_log : [INFO] 遍历测试持续时间 -> 50.00s
    2016-11-24 18:33:52 sys_log : [INFO] 遍历测试持续时间 -> 1.00m
    2016-11-24 18:34:02 sys_log : [INFO] 遍历测试持续时间 -> 1.17m
    2016-11-24 18:34:12 sys_log : [INFO] 遍历测试持续时间 -> 1.33m

    请问这是什么原因呢??

  • #143 楼 @quqing 我的意思是,窗口有细微变化时,不应该认为是新窗口,而您的这个特殊处理还是让他成为新窗口了,我没理解错吧