Appium之切换Native和WebView

1、关于Native?

native是使用原生系统内核的,相当于直接在系统上操作。是我们传统意义上的软件,更加稳定。Native_App即原生APP开发模式,利用iOS、Android开发平台官方提供的开发工具进行APP的开发。

 

2、关于WebView?

WebView是一个基于webkit引擎、展现web页面的控件,它的作用是用来展示一个web页面。

Android的Webview在低版本和高版本采用了不同的webkit版本内核,Android4.4+版本直接使用了Chrome作为内置网页浏览器。

现在大部分app都是混合式的native+webview,即Hybrid_App(混合应用)。

 

使用weditor工具,获取到小猿搜题app-》英语作文-》优秀作文-》打开其中一篇,得到的webview如下:

Appium之切换Native和WebView

 

但通过脚本运行却找不到WebView,源码如下:

from appium import webdriver
from time import sleep

desired_caps = {
    autoLaunch: "True",
    platformName: Android,
    deivceName: Android 10.0,
    platformVersion: 10.0,
    appPackage: com.fenbi.android.solar,
    appActivity: com.fenbi.android.solar.activity.RouterActivity,
    noReset: True,
}

driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub, desired_caps)
# driver.find_element_by_xpath(‘//*[@resource-id="com.fenbi.android.solar:id/bottom_bar_viewpager"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[2]/android.widget.ImageView[1]‘).click()
driver.find_element_by_android_uiautomator(new UiSelector().textStartsWith("英语作文")).click()
driver.find_element_by_xpath(//*[@resource-id="com.fenbi.android.solar:id/grid_view"]/android.widget.LinearLayout[2]/android.widget.ImageView[1]).click()
driver.find_element_by_xpath(//android.widget.ListView/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]).click()
print(driver.contexts)

运行结果:
[‘NATIVE_APP‘]

 

网上查询得知:

该app未开启WebView远程调试功能(实际中可由开发人员增加WebView调试功能后重新打包apk)。

 

3、通过driver.switch_to.context() 进行Native和WebView切换?

3.1 查看手机内置WebView版本:

方法1:手机上使用Chrome浏览器里打开:https://liulanmi.com/labs/core.html

方法2:cmd执行命令:adb shell am start -a android.intent.action.VIEW -d https://liulanmi.com/labs/core.html

方法3:电脑上使用Chrome浏览器上打开:chrome://inspect/#devices,查看Devices中显示的手机内置WebView版本号(即手机中已安装Chrome浏览器的版本号)

Appium之切换Native和WebView

 

3.2 保证Appium路径下的chromerdriver驱动与手机内置WebView版本匹配:

(1)查看chromedriver.exe版本:

进入chromedriver路径:D:\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win,双击chromedriver.exe

(2)进入https://chromedriver.storage.googleapis.com/index.html,根据版本对应关系,下载对应版本的chromedriver,替换chromedriver路径下的chromedriver.exe程序

from appium import webdriver
from time import sleep

desired_caps = {
    autoLaunch: "True",
    platformName: Android,
    deivceName: Android 10.0,
    platformVersion: 10.0,
    appPackage: com.fenbi.android.solar,
    appActivity: com.fenbi.android.solar.activity.RouterActivity,
    noReset: True,
    chromedriverExecutable: rD:\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe,  # 指定Chromedriver.exr的路径
}

driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub, desired_caps)
sleep(5)
# driver.find_element_by_xpath(‘//*[@resource-id="com.fenbi.android.solar:id/bottom_bar_viewpager"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[2]/android.widget.ImageView[1]‘).click()
driver.find_element_by_android_uiautomator(new UiSelector().textStartsWith("英语作文")).click()
sleep(2)
driver.find_element_by_xpath(//*[@resource-id="com.fenbi.android.solar:id/grid_view"]/android.widget.LinearLayout[2]/android.widget.ImageView[1]).click()
sleep(2)
driver.find_element_by_xpath(//android.widget.ListView/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]).click()
print(driver.contexts)
# print(driver.current_context)
driver.switch_to.context("WEBVIEW_chrome")    # driver.switch_to.context()切换到WebView
print(driver.current_context)
# contents = driver.find_elements_by_class_name("android.view.View")
# for content in contents:
#     print(content.get_attribute("text"))
print(driver.page_source)


运行结果:
[‘NATIVE_APP‘, ‘WEBVIEW_chrome‘]
WEBVIEW_chrome
<html><head></head><body></body></html

 

 

分享几篇关于Appium WebView调试方法:

https://www.cnblogs.com/wmhuang/p/7396150.html

https://www.cnblogs.com/sao-fox/p/6396984.html

http://www.xuetimes.com/archives/1167

 

Appium之切换Native和WebView

上一篇:axios拦截器 和 vue导航守卫的理解


下一篇:uni-app中picker-view显示默认值的注意点(坑)