1.Appium Log
清晰记录了所有的请求和结果
@Test
public void testDebug() throws InterruptedException,IOException{
MobileElement tiaoguo = (MobileElement) driver.findElementByXPath("//*[@text='跳过']");
FileUtils.copyFile(new File("tiaoguo.png"),tiaoguo.getScreenshotAs(OutputType.FILE));
Thread.sleep(15000);
}
IDE执行结果:提示方法没有实现
appium日志
通过log中可以获取更多的信息,如
在screenshot方法执行时,有URL链接,加上IP和port,访问就可以获取到更多信息。
127.0.0.1:4723/wd/hub/session/92fe82c7-02ac-4fca-a8da-eca08027f985/element/1/screenshot
可以看到/appium/node_modules/appium-base-driver/lib/basedriver/driver.js:249:13中方法未实现
{"value":{"error":"unknown method","message":"Method has not yet been implemented","stacktrace":"NotYetImplementedError: Method has not yet been implemented
at AndroidDriver.executeCommand$ (/usr/local/lib/node_modules/appium/node_modules/appium-base-driver/lib/basedriver/driver.js:249:13)
at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
at enqueueResult (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:185:17)
at Promise (<anonymous>)
at F (/usr/local/lib/node_modules/appium/node_modules/core-js/library/modules/$.export.js:30:36)
at AsyncIterator.enqueue (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:184:12)
at AsyncIterator.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at Object.runtime.async (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:209:12)
at AndroidDriver.executeCommand (/usr/local/lib/node_modules/appium/node_modules/appium-base-driver/build/lib/basedriver/driver.js:271:34)
at AppiumDriver.executeCommand$ (/usr/local/lib/node_modules/appium/lib/appium.js:377:50)
at tryCatch (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke [as _invoke] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at GeneratorFunctionPrototype.invoke (/usr/local/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:169:7)"}}
cat -n /usr/local/lib/node_modules/appium/node_modules/appium-base-driver/lib/basedriver/driver.js
2.getPageSource
界面的完整dom结构.xml文件
封装locate方法,加入异常处理,将获取的节点信息在编辑器中打开,检索控件。
public WebElement locate(String locate){
try {
if (locate.matches("\/\/.*")) {
return driver.findElementByXPath(locate);
} else {
return driver.findElementById(locate);
}
}catch (org.openqa.selenium.NoSuchElementException EX){
System.out.println(locate);
System.out.println(driver.getPageSource());
return null;//没有返回值,代码会报错
}
}
@Test
public void TestDriver() throws InterruptedException{
Thread.sleep(5000);
//driver.findElementByXPath("//*[@text="允许"]").click();
locate("//*[@text="允许"]").click();
Thread.sleep(2000);
}
因为locate中返回的null,click找不到会因找不到控件报ava.lang.NullPointerException错误
3.脚本内调试
利用xpath获取所有匹配的元素 driver.findElementByXpath("//*")
public WebElement locate(String locate) throws InterruptedException{
try {
if (locate.matches("\/\/.*")) {
return driver.findElementByXPath(locate);
} else {
return driver.findElementById(locate);
}
}catch (org.openqa.selenium.NoSuchElementException EX){
List<AndroidElement> lists = driver.findElementsByXPath("//*");
for(AndroidElement e:lists){
System.out.print("tag: "+e.getTagName()+" ");
System.out.print("text: "+e.getText()+" ");
System.out.println("id: "+e.getAttribute("resourceId"));
//System.out.println(e.getAttribute("contentDesc"));该属性有误,content-desc也不可用
Thread.sleep(500);
}
return null;
}
}
FAQ
1.tagName打印null
@Test
public void TestDriver() throws InterruptedException{
Thread.sleep(5000);
List<AndroidElement> lists66 = driver.findElementsByXPath("//*");
for(AndroidElement e66:lists66){
System.out.print("tag: "+e66.getTagName()+" ");
System.out.print("text: "+e66.getText()+" ");
System.out.println("id: "+e66.getAttribute("resourceId"));
Thread.sleep(500);
}
Thread.sleep(20000);
}