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

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

1.Hybrid app 例如58同城node

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

2.元素准备:ios

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

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

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

 

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

 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:\appium\apk\58同城.apk | findstr package
        desiredCapabilities.setCapability("appPackage", "com.wuba");
        //appActivity 经过入口咱们启动测试的app
        //aapt dump badging D:\appium\apk\58同城.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:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe
[info] [Chromedriver] Spawning chromedriver with: C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.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:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\appium-support\lib\logging.js:69:13)
    at Chromedriver.callee$2$0$ (C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\appium-chromedriver\lib\chromedriver.js:217:13)
    at tryCatch (C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40)
    at GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:315:22)
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as throw] (C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:100:21)
    at GeneratorFunctionPrototype.invoke (C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:37)
    at <anonymous>

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

 

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

 

下载解压后覆盖本地appium驱动:
C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win

 

再次运行脚本执行报错:

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:\Users\Administrator\Desktop>adb version
Android Debug Bridge version 1.0.31

更换adb版本

C:\Users\Administrator\Desktop>adb version
Android Debug Bridge version 1.0.40
Version 4986621
Installed as D:\appium\android-sdk-windows-appium\platform-tools\adb.exe

再次运行脚本执行成功:

5. 扩展:

打开手机中的应用管理.>>找到所有中的WebView

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

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

相关文章
相关标签/搜索