建议你把具体解决办法添加到主楼 方便其他有相同问题的人
我写了个 demo List 的最后一个就是最后一个红包
做肯定应该是能做的 你再研究一下吧
try {
Thread.sleep(15000);//我用来点开微信的
List<WebElement> elementList = driver.findElementsByAndroidUIAutomator("new UiSelector().resourceId(\"com.tencent.mm:id/a_a\")");
if (elementList.isEmpty()) {
return;
}
for (WebElement element : elementList) {
System.out.println("坐标为:" + element.getLocation().x + "," + element.getLocation().y);
}
} catch (NoSuchElementException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
输出
坐标为:327,1224
坐标为:327,1518
你的手机是 6.0 以下 检测不到 PopUpWIndow 的
区别:element 的 click 事件默认是去 tap 这个 view 的中间位置坐标
对于你这个情况 如果覆盖 View 位置是定死的 在你拿到 element 的时候 获取位置和坐标 判断一下就行了
对于其他不能确定的情况,还是比较复杂,目前我只是基于 Xpath 来判断,还没搞出一个又快又完善的办法来
python 我不知道
java 我亲测使用有这个 api ,并且返回的是 list
Python java 用的都是 android 的 UIautomator ,java 能支持的话 python 应该也能支持的
你试试有没有 find_elements_by_android_uiautomator
这个方法
使用find_elements_by_name
返回 name 为该值的所有 element 点最后一个
ref
这个方法传的应该不是 adb 的指令
you can't run adb commands directly using appium client. I saw a request for such functionality maybe a half year ago and the conclusion was that if there is some specific adb command user want to execute and it is not covered with appium functionality, you have to do it on your own.
issue
代码里自己调 adb 来用执行吧,说起来我还不知道 execute 这方法怎么用
这我就不知道了 通常我的 capability 比你这个多了个 udid 和 app 字段
udid 存的是 你这的 “PBV7N16C29013577” app 是 apk 路径 deviceName 都是瞎填的
你先试试换成.ui.MainAcitivity
A new session could not be created. (Original error: com.innext.souyijie/.ui.activity.LaunchActivity never started. Current: com.innext.souyijie/.ui.MainActivity,)
你的启动 Activity 是不是填错了,光贴日志,自己都不看吗
find 层加一下判断?
这个是啥意思,能否进一步说明一下..
他这个 ClassName 从一开始就是错的
稍微跟了一下源码 UiAutomator 是最后调用到了一个叫做 AccessibilityNodeInfo 的类
在 android-22 中 ViewGroup 是调用父类 View 的 onInitializeAccessibilityNodeInfo 方法,所以获取 className 的时候拿到的是 View.class.getName()
void onInitializeAccessibilityNodeInfo (AccessibilityNodeInfo info)
Initializes an AccessibilityNodeInfo with information about this view. The base implementation sets:
......
setClassName(CharSequence),
.......
在 android-23 中 ViewGroup 的 onInitializeAccessibilityNodeInfo 方法被 @hide 掉了 看 api 文档已经没有了
而是使用的 getAccessibilityClassName 从而导致了 2 个系统版本的差异
public CharSequence getAccessibilityClassName(){
return ViewGroup.class.getName()
}
getAccessibilityClassName
added in API level 23
CharSequence getAccessibilityClassName ()
Return the class name of this object to be used for accessibility purposes. Subclasses should only override this if they are implementing something that should be seen as a completely new class of view when used by accessibility, unrelated to the class it is deriving from. This is used to fill in AccessibilityNodeInfo.setClassName.
资料来源:
View 的 onInitializeAccessibilityNodeInfo
ViewGroup 的 getAccessibilityClassName
Accessibility 相关
打开需要解析的页面 输出 uix 文件
adb shell uiautomator dump /data/local/tmp/app.uix
adb pull /data/local/tmp/app.uix <路径>
再输出截图
adb shell screencap -p /data/local/tmp/app.png
adb pull /data/local/tmp/app.png <路径>
有了截图和 uix,就可以使用导入到 ui automator 解析了
默认就是会重启,如果 DesiredCapabilities 配置了 noReset 为 True 就不会重启。如果无效,你看看你的 DesiredCapabilities 是否配置了 app 这个字段,我记得以前没配置这个字段也不会重启。
因为你所有的子类都继承了 initAppium 这个父类,子类 HomeTest 持有的 driver 和子类 LoginTest 持有的 driver 内存地址是不一样的,但是又因为 TestNG 有 beforesuite 的限制存在,所以你的 driver 只被初始化一次。你如果把 driver 的初始化放到@beforeclass下应该就行了。
appium server 的默认地址
这个推荐使用 OCR 来识别 或者 使用 OpenCV 的特征匹配 ,模板匹配在不同分辨率下效果比较差。
你们公司负责行测题的去年被骂惨了。。
win+ubuntu..
没看先赞,LZ 加油。。
官方说点击的操作如下:
d 0 10 10 50
c
u 0
c
为何我这样操作还是跟长按了一样。。
要是不考虑多线程你可以直接在父类 Init 中定义一个 static 类变量即可。考虑多线程的话通过 ITestListener 的回调方法拿到对应的类实例,通过 getter 和 setter 来设置唯一值。我也还没实践过,应该是可行的。
在你的 xml 中@BeforeTest只执行一次,把 xml 文件里的 classTwoMethod 放到新的一个 test 标签下即可,看楼上给的连接你就知道怎么回事了
git submodule init 失败的可以试试先 git submodule sync