Appium appium 也需要切换 frame?

dy20082250 · 2017年12月11日 · 最后由 等待の疯 回复于 2019年02月23日 · 3343 次阅读


在真机上跑自动化脚本

发现一个问题:
在我点击了图中的确定按钮后

对话框确实消失了

但是手机屏幕的聚焦没有回到主页面
无法点击主页面中的任何元素

我在做 web 自动化的时候知道有一个 iframe 切换的概念?
难道 appium 中也有吗?

如果是的话,怎么切换呢?
没有 id,没有 name
xpath 好像。。。

共收到 8 条回复 时间 点赞

标记一下,要不不好找自己的帖子

dy20082250 回复

切换 webview 吧

End 回复

我查过了,目前 app 是 native,没有 webview

我换了一种思路来做这个脚本
从功能验证的角度来看是一样的

只是为什么点击完 popup 后就不能识别页面中的元素,我还
没有找到原因

真心觉得 appium 有太多坑

我找到了结果的方法,虽然看上去完全不符合逻辑,但脚本就是按照功能测试的目标运行的:

public void  testMePage_ClearCache() {
        goToMe();
        action.click(By.xpath("//android.widget.TextView[@text=\"清空缓存\"]"), "点击清空缓存");
        action.click(By.id("com.eisoo.anycontent:id/positiveButton"), "点击确定按钮");
//      action.sleep(2, "调试");
//      action.clickScreen(75, 147, 50, "");


        action.back("");


        action.click(By.id("com.eisoo.anycontent:id/ll_left"), "点击左上角的返回");
        action.click(By.xpath("//android.widget.TextView[@text=\"设置\"]"), "点击设置");
        boolean isExist = false;
        isExist = action.verifyExist(By.xpath("//android.widget.TextView[@text=\"当前缓存:0B\"]"), "断言缓存已被清除");
        FrameAssertion.isTrue(isExist, "断言缓存已被清除");
        action.click(By.id("com.eisoo.anycontent:id/ll_left"), "点击左上角的返回");
    }

我这里要解释一下,在点击如图所示的确定按钮之后

我本该做的操作是判断清除缓存的效果元素
可是获取不到

我就尝试点击左上角的返回图标
还是获取不到

这两种情况下,我开始怀疑是否存在 frame 切换的问题
可是在尝试了 driver.switchTo()
之后还是获取不到

没办法,最终想到了使用
driver.back()

但是让我困惑的也正出现在这里!!

driver.back() 确实起了效果,让我返回到上一个页面,但是这时候又能够点击左上角的返回图标了
问题是上一个页面中是不存在这个图标的,大家可以看第一个图,图中是没有左上角的返回图标的

所以,我现在怀疑存在一个时间差的问题
但是暂时没找到 root cause

大家有什么想法都可以留言

其实也就是说并没能完全按照我原本的意图做到模拟用户的操作
我只是回避了直接点击屏幕中的控件
而采用系统级别的 back 函数

但是我确实是很想搞清楚为什么点击确定按钮以后,自动化脚本就失去了对屏幕的控制
为什么就识别不到页面中的控件了

我还是倾向于认为发生了 frame 的切换
只是我在点击 确定 按钮的时候确实没有主动切换 frame,而这在 web 自动化测试中是不可能的
在 web 中必须主动切换 frame,然后再主动切换回去

但是我在点击 确定 按钮之前没有切换 frame,结果可以正常点击

在点击 frame 之后,回不到主界面了。。。。

楼主找到好的方法 以及出现的原因了吗?我今天也碰到了,但是 inspector 的时候,发现很多分钟后,inspector 自己又能识别了。。只是这个时长 太慢了

用屏幕坐标定位元素 +TouchAction 试试看

一样的问题,还是用 driver.quit() 来规避这个地方,让我崩溃的是,用 Touchaction 或者 driver.quit() 有的时候都无法返回,最后直接写一个 for 循环遍历,点一次返回,验证一次,没验证到就继续点返回!😓 😓 😓 😓

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册