Appium Appium_Android 怎么检查页面元素是否存在

55hhy · October 30, 2014 · Last by 55hhy replied at October 30, 2014 · 4463 hits

一般页面上有Start按钮,没有Start之前其他的元素都不可点:
但是如果Start之后就没有Start,页面元素都可点:

现在的问题是我判断Start按钮是否存在时,总是会直接判断页面元素存在,不存在就直接报错,源码如下:

public void checkSPStatus(){
if(driver.findElementById("com.ef.efekta.englishtown:id/planButton")==null){
WebElement lessonOne = driver.findElementByXPath("//android.view.View[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]");
lessonOne.click();
}
}

报错信息:

info: [debug] [BOOTSTRAP] [debug] Got command of type ACTION
info: [debug] [BOOTSTRAP] [debug] Got command action: click
info: [debug] Responding to client with success: {"status":0,"value":true,"sessionId":"88e61052-a8ec-48cd-bf98-bdc1567d4362"}
info: <-- POST /wd/hub/session/88e61052-a8ec-48cd-bf98-bdc1567d4362/element/3/click 200 285.858 ms - 76 {"status":0,"value":true,"sessionId":"88e61052-a8ec-48cd-bf98-bdc1567d4362"}
info: [debug] [BOOTSTRAP] [debug] Returning result: {"value":true,"status":0}
info: --> POST /wd/hub/session/88e61052-a8ec-48cd-bf98-bdc1567d4362/element {"using":"id","value":"com.ef.efekta.englishtown:id/planButton"}
info: [debug] Pushing command to appium work queue: ["find",{"strategy":"id","selector":"com.ef.efekta.englishtown:id/planButton","context":"","multiple":false}]
info: [debug] [BOOTSTRAP] [debug] Got data from client: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.ef.efekta.englishtown:id/planButton","context":"","multiple":false}}
共收到 31 条回复 时间 点赞

web 页面?

55hhy #2 · October 30, 2014 作者

#1楼 @lihuazhang Android页面 不是web 只是是平板App 不是手机App

#2楼 @55hhy 有点看不懂

现在的问题是我判断Start按钮是否存在时,总是会直接判断页面元素存在,不存在就直接报错
这个是啥意思?

55hhy #4 · October 30, 2014 作者

#3楼 @lihuazhang

if(driver.findElementById("com.ef.efekta.englishtown:id/planButton")==null)

这句 页面元素不存在应该是直接执行

lessonOne.click();

但是现在就说找不到if判断里面的元素

#4楼 @55hhy 依然不懂。。

WebElement lessonOne = driver.findElement(By.clasaname(""));
boolean lessonOneEnable = lessonOne.isEnabled();
if(lessonOneEnable){
lessonOne.click();
} else {
WebElement startBtn = drvier.findElement(By.id(""));
startBtn.click();
lessonOne.click();
}
不知道这个可不可以

55hhy #7 · October 30, 2014 作者

#5楼 @lihuazhang
看图 第一张图上Start点击之后就会到第二张图,同时第二张图上所有元素就可以点击
所以我要先判断这个Start button有没有被点击过,点了就不存在了,不存在了我就进行其他操作了
结果判断Start的我就写在if判断里面

if(driver.findElementById("com.ef.efekta.englishtown:id/planButton")==null)

最终就是每次必须存在,Start不存在就直接在这里挂了

55hhy #8 · October 30, 2014 作者

#6楼 @chenleslie It works,thank you very much!

#7楼 @55hhy 哦 你的意思是假如 startButton 不出现, driver.findElementById("com.ef.efekta.englishtown:id/planButton") 就会出错吧?

#10楼 @55hhy 那是因为你的元素没有render出来,去find肯定会出错。

getAttribute看一下enabled,clickable,大概只是不可见

#6楼 @chenleslie @55hhy 这个代码会有逻辑风险。如果有个bug,不点start,也能开始lesson。

55hhy #14 · October 30, 2014 作者

#13楼 @lihuazhang 能详细说说吗?水平很差的,我。

#14楼 @55hhy 你的逻辑是只有start了才能点击lesson吧?

55hhy #16 · October 30, 2014 作者

#15楼 @lihuazhang 嗯。但是有时候进来就已经Start了,那就直接点击lesson

#16楼 @55hhy 那看你们能否接受了。。

55hhy #18 · October 30, 2014 作者

#17楼 @lihuazhang 接受什么?

#18楼 @55hhy 你这边的用例是不是:

进入,看到 start, 点击 start, 才能开始?

那你现在出现了一进来已经start了,这是否能接受啊

55hhy #20 · October 30, 2014 作者

#19楼 @lihuazhang 哦 这个是因为有些账号用户可能之前就Start了 那再次进来就已经是Started状态了

#19楼 @lihuazhang 我想点start的目的就是为了能够点lesson,所以,start点不点不是关键

#21楼 @chenleslie
#20楼 @55hhy

嗯,我知道,所以我说的是,如果有一个bug, 比如一个新人,啥都没开始,他一进来无需点击start button,就可以开始lesson1,如果 start button 那边有业务逻辑,那就糟糕了。

不存在就報錯 <--- 所以你應該用try catch


try {
WebElement check = driver.findElementById("com.ef.efekta.englishtown:id/planButton");
//如果存在執行這裡
} catch (Error e) {
//如果不存在執行這裡
}

两个用例,一个用没点过start的账号,另一个用点过start的账号。
基本上在业务视角每个用例只有一种结果。

55hhy #25 · October 30, 2014 作者

#22楼 @lihuazhang 现在的逻辑是这样子处理的

public void checkSPStatus(){

WebElement lessonOne = driver.findElementByXPath("//android.view.View[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]");
if (!lessonOne.isEnabled()) {
driver.findElementById("com.ef.efekta.englishtown:id/planButton").click();
}
else{
lessonOne.click();
}
}

如果有Start的话 Lesson是点不了的

程序出错是因为 driver.findElementById("com.ef.efekta.englishtown:id/planButton") 语句执行直接抛异常了,然后就终止了代码的执行。你可以用捕获异常的方式进行处理,23楼已给出样例

使用try catch即可

比如start这个功能,设计了这两个用例:
用例A:
1、新注册账号进入页面。期望结果:lesson1不可点
2、点击start。期望结果:start消失
3、点击lesson1,期望结果:进入相应页面

用例B:
1、新注册账号进入页面。
2、点击start。期望结果:start消失
3、退出应用,再次进入页面。期望结果:没有start按钮。
4、点击lesson1,期望结果:进入相应页面

假如app包含这样的bug:新注册的用户进入页面没有start按钮,lesson1可点击。按25楼的写法会漏掉这个bug。
假如有另一个bug:新注册的用户进入页面有start按钮,lesson1可点击。还是会漏掉。

55hhy #29 · October 30, 2014 作者

#28楼 @sanlengjingvv 脑洞大开 不过现在还没有这么细 我主流程还没有走通 磕磕绊绊啊

楼主,请问你这个问题解决了没有呢,我这边使用if(driver.findElementByName("登 录").isEnabled()),当登录按钮不存在的时候会报错的

55hhy #31 · June 16, 2015 作者

#30楼 @miumiu 对 元素不存在的时候是会报错的 只能找其他按钮来判断
在评论里面我们找到了解决方案 就是迂回的

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up