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

庆生 · April 09, 2018 · Last by 庆生 replied at April 10, 2018 · 1902 hits

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

共收到 17 条回复 时间 点赞

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

webview 吧

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

庆生 #4 · April 09, 2018 Author
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 位客户号正常登录测试通过!");

}

庆生 #5 · April 09, 2018 Author

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

庆生 #6 · April 09, 2018 Author
BeNice 回复

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

庆生 #7 · April 09, 2018 Author

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

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

把 native 切换到 webview

庆生 #10 · April 09, 2018 Author
战 神 回复

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

庆生 #11 · April 09, 2018 Author
Hi大少 回复

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

庆生 #12 · April 10, 2018 Author

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

庆生 #14 · April 10, 2018 Author
FFFFFFFFFF 回复

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

driver.getPageSource() 打印下看看

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

庆生 #16 · April 10, 2018 Author
北溟 回复

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

庆生 #17 · April 10, 2018 Author

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

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