APP自动化之Hybrid自动化脚本实现示例(八)

需求示例:打开58同城=>本地服务=>搬家

1.Hybrid app 例如58同城

  >  Hybrid自动化开发思路
  >  识别-webview视图
  >  获取所有的contexts:driver.getContextHandles();
  >  切换-切换到webview视图:driver.context(webview视图)
  >  定位-定位webview中的元素,并执行操作:web网页元素定位和操作
  >  切换-切换回默认的视图:driver.context(native视图)

2.元素准备:

(1) 首先我们使用uiautomatorviewer.bat获取native页面元素:resources-id: com.wuba:id/iv_icon_big_group

点击进入本地服务后,进入webview页面,使用uiautomatorviewer.bat无法获取元素的时候我们采用UC开发者工具定位元素

(2)使用UC开发者工具获取webview页面元素

 

搬家xpath : //*[@id="branchList"]/div/div[1]/div[2]/div/ul/li[2]/div/span

 3.上代码

package app_auto;

import java.net.URL;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.android.AndroidDriver;

public class HybridDemo {
    public static AndroidDriver<WebElement> androidDriver = null;
    public static void main(String[] args) throws Exception{
        //1.创建配置对象
        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        //2.添加配置
        //deviceName:找到我们要测试的设备
        desiredCapabilities.setCapability("deviceName", "127.0.0.1:62001");
        //platformName 确定我们要测试的系统平台 Android or ios
        desiredCapabilities.setCapability("platformName", "Android");
        //appPackage 找到我们要测试的应用 
        //aapt dump badging D:appiumapk58同城.apk | findstr package
        desiredCapabilities.setCapability("appPackage", "com.wuba");
        //appActivity 通过入口我们启动测试的app
        //aapt dump badging D:appiumapk58同城.apk | findstr activity
        desiredCapabilities.setCapability("appActivity", "com.wuba.activity.launch.LaunchActivity");
        // noReset:启动App测试不会清除掉应用的数据 true:不清楚 false:清除掉
        desiredCapabilities.setCapability("noReset", true);
        //实例化驱动,启动测试APP
        //第一个参数,appium通讯地址
        //第二个参数,配置
        androidDriver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);
        //添加隐试等待的方法 30秒
        androidDriver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        Thread.sleep(5000);
        //调用实现方法
        native_webView();
        Thread.sleep(5000);
        androidDriver.quit();
        System.out.println("执行结束!");
    }
    public static void native_webView() throws InterruptedException {
        //1.点击主页上的本地服务
        androidDriver.findElementsByAndroidUIAutomator("resourceId("com.wuba:id/iv_icon_big_group")").get(6).click();
        //2.休眠等待,然后获取页面所有的contexts(相当于web自动化中的句柄)
        Thread.sleep(5000);
        //3.获取当前页面的所有contexts,
        //原生页面的context:NATIVE_APP, web页面的context:WEBVIEW_com.wuba
        Set<String> contexts = androidDriver.getContextHandles();
        System.out.println(contexts);
        //4.切换到web页面对应的context中
        for (String contextName : contexts) {
            //如果contextName有包含WEBVIEW关键字的话就是我们要找的web页面context
            if(contextName.contains("WEBVIEW_com.wuba")) {
                androidDriver.context(contextName);
            }
        }
        Thread.sleep(5000);
        //此时我们就切换到了web页面的定位方式
        androidDriver.findElementByXPath("//*[@id="branchList"]/div/div[1]/div[2]/div/ul/li[2]/div/span").click();;
        //web页面操作完成之后要记得回到native页面的context中,否则无法定位到原生app的元素
        androidDriver.context("NATIVE_APP");
    }    
}

4.运行报错

查看appium日志分析原因:是chromeDriver与浏览器内置System webView控件不兼容导致

[info] [Chromedriver] Set chromedriver binary as: C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesappium-chromedriverchromedriverwinchromedriver.exe
[info] [Chromedriver] Spawning chromedriver with: C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesappium-chromedriverchromedriverwinchromedriver.exe --url-base=wd/hub --port=8000 --adb-port=5037 --verbose[debug] [Chromedriver] Chromedriver version: '2.20.353145'
[error] [Chromedriver] Error: Failed to start Chromedriver session: A new session could not be created. (Original error: session not created exception
from unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"6AB007871163EAF0A479AC630302F975","isDefault":true,"type":"default"},"id":1,"name":"","origin":"https://app.58.com"}
  (Session info: chrome=74.0.3729.136)
  (Driver info: chromedriver=2.20.353145 (343b531d31eeb933ec778dbcf7081628a1396067),platform=Windows NT 6.1 SP1 x86_64))
    at Object.wrappedLogger.errorAndThrow (C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesappium-supportliblogging.js:69:13)
    at Chromedriver.callee$2$0$ (C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesappium-chromedriverlibchromedriver.js:217:13)
    at tryCatch (C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesabel-runtime
egenerator
untime.js:67:40)
    at GeneratorFunctionPrototype.invoke [as _invoke] (C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesabel-runtime
egenerator
untime.js:315:22)
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as throw] (C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesabel-runtime
egenerator
untime.js:100:21)
    at GeneratorFunctionPrototype.invoke (C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0
esourcesapp
ode_modulesappium
ode_modulesabel-runtime
egenerator
untime.js:136:37)
    at <anonymous>

解决方法:
(1) 根据浏览器版本更换驱动
(2) 根据驱动版本,更新升级手机中的WebView组件
这里我们查看本机控件版本,在UC工具中有显示:

 

我们下载对应的驱动:https://npm.taobao.org/mirrors/chromedriver/

 

下载解压后覆盖本地appium驱动:
C:UsersAdministratorAppDataLocalappium-desktopapp-1.5.0 esourcesapp ode_modulesappium ode_modulesappium-chromedriverchromedriverwin

 

再次运行脚本执行报错:

Exception in thread "main" io.appium.java_client.NoSuchContextException: An unknown server-side error occurred while processing the command. Original error: Failed to start Chromedriver session: An unknown server-side error occurred while processing the command. (Original error: unknown error: Failed to forward ports to device 127.0.0.1:62001. No port chosen: . Perhaps your adb version is out of date. ChromeDriver 2.39 and newer require adb version 1.0.38 or newer. Run 'adb version' in your terminal of the host device to find your version of adb.

分析原因:

adb版本已经过时了。ChromeDriver 2.39及更新版本需要adb 1.0.38或更新版本。在主机设备的终端上运行“adb版本”

C:UsersAdministratorDesktop>adb version
Android Debug Bridge version 1.0.31

更换adb版本

C:UsersAdministratorDesktop>adb version
Android Debug Bridge version 1.0.40
Version 4986621
Installed as D:appiumandroid-sdk-windows-appiumplatform-toolsadb.exe

再次运行脚本执行成功:

5. 扩展:

打开手机中的应用管理.>>找到全部中的WebView

App应用程序是使用系统内置的WebView组件来渲染app内的web页面的;但是有些应用,如微信和QQ等使用的是腾讯二次开发定制的WebView也就是X5内核,来渲染内嵌web网页,如公众号等,可以根据当前WebView的组件版本下载对应的ChromeDriver.exe驱动 

未完待续................

原文地址:https://www.cnblogs.com/xiaozhaoboke/p/11324837.html