Appium 急急急,请大神指教: APPIUM+Eclipse+Maven+Java+TestNG+ReportNG 环境: findElementById 无法找到元素

庆生 · 2018年04月09日 · 最后由 庆生 回复于 2018年04月10日 · 2646 次阅读

请问,在 UI 自动化测试开发中,遇到下面的问题, 下面的页面,findElementById 定位页面上的元素,都找不到,请问有哪些原因
id 都是通过工具 uiautomatorviewer 获得。急急急,请大神指教

共收到 17 条回复 时间 点赞

把代码和报错信息贴出来才能帮你找原因

webview 吧

你这个问题其他同学是无法帮助到你的,你需要把 uiautomatorviewer 截图,代码截图以及要查找的元素给标注清楚。同时这个场景是不适合做自动化测试的,有验证码。如果验证码不能通过接口来获取,你的测试用例是无法通过的。

Jerry li 回复

两个测试用例:
先执行第一个测试用例 (priority=2),用户不输入交易账号,直接点击登录,弹出一个消息框"输入的账号不能为空!",点击"确定"按钮
再执行第二个测试用例 (priority=3),调用代码(driver.findElementById("com.tebonsc:id/edit_account").sendKeys("99006");)自动输入交易账号,这时就报下面的错误:

org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 44 milliseconds

下面是这两个测试用例的代码:
@Test(priority = 2)
public void InputEmptyDealAccount() throws InterruptedException {

driver.findElementByXPath("//android.widget.FrameLayout[@resource-id='android:id/content']/android.widget.RelativeLayout/"
+ "android.widget.LinearLayout/android.widget.RelativeLayout/android.view.ViewGroup/"
+ "android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/"
+ "android.widget.LinearLayout[2]/android.widget.LinearLayout/android.widget.ImageView").click();
Thread.sleep(5000);
driver.findElementByXPath("//android.view.View[@content-desc='点击请登录']").click();
Thread.sleep(5000);

//手机验证码登录
driver.findElementById("com.tebonsc:id/edit_PhoneNumber").sendKeys("13900000000");
driver.findElementById("com.tebonsc:id/image_yanzhengma").click();
Thread.sleep(5000);
driver.findElementById("com.tebonsc:id/iamge_login").click();
Thread.sleep(5000);

//交易账号登录
driver.findElementById("com.tebonsc:id/login").click();
Thread.sleep(5000);

String loginhint = driver.findElementByXPath("//android.widget.TextView[@text='输入的账号不能为空!']").getText();
if(loginhint.contains("输入的账号不能为空")) Assert.assertEquals(true, true);

driver.findElementByXPath("//android.widget.Button[@text='确定']").click();

Thread.sleep(5000);

//driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Reporter.log("InputEmptyDealAccount: 未输入客户号进行登录测试通过!");

}

@Test(priority = 3)
public void LoginSuccess() throws InterruptedException {

//交易账号登录
driver.findElementById("com.tebonsc:id/edit_account").sendKeys("99006");
Thread.sleep(5000);
driver.findElementById("com.tebonsc:id/edit_password").sendKeys("111111");
Thread.sleep(15000);
driver.findElementById("com.tebonsc:id/login").click();
Thread.sleep(10000);

//Check login dealing account info
String dealaccount = driver.findElementByXPath("//android.view.View[@content-desc='王']").toString();
if(dealaccount.contains("王
")) Assert.assertEquals(true, true);
String saledepart = driver.findElementByXPath("//android.view.View[@content-desc='上海凉城路证券营业部']").toString();
if(dealaccount.contains("上海凉城路证券营业部")) Assert.assertEquals(true, true);

Thread.sleep(5000);

//swipe to Main UI of APP for later test
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
int srcwid = width-10;
int srcheight = height/2;
driver.tap(1, srcwid, srcheight, 500);
Thread.sleep(5000);

Reporter.log("LoginSuccess: 12 位客户号正常登录测试通过!");

}

庆生 #13 · 2018年04月09日 Author

我查了,就是那个交易账号的编辑框 "com.tebonsc:id/edit_account" 没定位到。

BeNice 回复

没明白,你说的意思。能再具体点吗

我发现在第一个测试用例,执行过 点击确定按钮之后,这个页面上的所有元素都定位不了。奇怪,这是什么道理。

默认 context 是 native 吧 要切换 context 到 webview

把 native 切换到 webview

战 神 回复

如何切换,我试了这个代码好像不行 driver.context("webview");
请指教

庆生 #12 · 2018年04月09日 Author
Hi大少 回复

怎么看出是 webview,我 看了下,没看出是 webview,请指教,如果进入这个登录页面后,不点击登录按钮,直接先输入客户号,是可以找到客户号编辑框的。
只有进入这个页面后,什么都不输入,直接点击登录,然后弹出 “客户号不能为空” 信息框,点击确定后,再定位客户号编辑框,就找不到这个编辑框了。我上面的代码有问题吗?

我打开开发者选项中显示布局边界选项,没看出是 webview,请大神指教

庆生 #13 · 2018年04月10日 Author
FFFFFFFFFF 回复

使用 driver.getContextHandles() 只获取到 NATIVE APP 的情况,我的手机 android 版本是 android 7.0

driver.getPageSource() 打印下看看

另外如果是 webview,当然你 app 没开那啥 debug 开关(就切换不到 webview),6.0 的以上系统貌似不用切换到 webview 也是能定位到的,但以前也遇到过类似找不到控件的问题(有些是 uiautomatorviewer 获取的与 getPageSource() 不一致,要以后者为准,有些就是定位不到...),这时候我是直接在当前页面划上划下(TouchAciton)一次。。就能定位到了

庆生 #16 · 2018年04月10日 Author
北溟 回复

driver.getPageSource() 会执行大概 20 秒,然后 app 就会推出,此时拿到的内容也不是 app 登录页面的内容,而是手机主页的内容

庆生 #17 · 2018年04月10日 Author

和 app 的作者沟通了下,好像实现没用 webview

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