appium01 appium定位Hybird中H5页面元素

<font size='9' face='黑体'>目录</font>

[TOC]

扩展连接

https://blog.csdn.net/galen2016/article/details/53534366

一、 移动端的应用

<font size="4">
        在手机移动端,支持3种应用格式:<font color='red'>Native应用</font>、<font color='red'>Web应用</font>以及<font color='red'>Hybird应用</font>。
</font>

1.1 Native应用

<font size="4">
        Native,是安卓手机的原生应用,可以理解为普通的app;
</font>

1.2 Web应用

<font size="4">
        Web应用依托于浏览器展示,也就是我们所说的网页;
</font>

1.3 Hybird应用

<font size="4">
        Hybird应用是介于Native和Web应用之间的应用模式,在Native应用中嵌入web页面实现应用展示界面的个性化定制,也就是在应用中嵌入H5程序,比较常见的有微信小程序等,这些H5页面再移动端通过Webview(<font color='blue'>Android提供的显示网页的系统控件</font>)访问。通过uiautomatorviewer在定位元素时,只有一个UI WebView的界面,无法获取元素细节,如图1.1所示。
</font>

<div align='center'>
<img src='https://i.loli.net/2018/04/14/5ad1a6c123354.png' width='600' height='450' align=center />
</div>

二、 Hybird应用H5元素获取

2.1 思路

<font size="4">
        获取Native应用的嵌入的H5页面的元素,可以通过获取该页面的URL地址,然后在web端利用chrome浏览器,获取该控件的定位语句,即可完成H5页面元素的定位。
</font>

2.2 步骤

2.2.1 识别app中的H5视图

<font size="4">
        识别app中的H5视图,可以打开手机的开发者模式,然后在开发者选项中打开显示布局边界的开关,打开开关之后,app的各个应用的组件的边界就会显示出来。如果是H5界面,可以看到,如下视图(图2.2)
</font>

<div align='center'>
<img src='https://i.loli.net/2018/04/14/5ad1a75349c2a.png' width='300' height='600' align=center />
</div>

<font size="4" color='blue'>
         如果是H5界面,可以看到,如下视图。
</font>

<div align='center'>
<img src='https://i.loli.net/2018/04/14/5ad1a78054eea.png' width='300' height='600' align=center />
</div>

2.2.2 在桌面端的谷歌浏览器中识别这个H5界面

<font size="4">
        对于Hybird中的H5界面,在谷歌浏览器中识别后,点击inspect,可以查看,当前这个H5页面的元素,谷歌浏览器识别app端Hybird应用H5页面的的准备工作如下:

        <font color='blue'>①</font><font color='red' face='楷体'>手机和电脑连接上,打开手机开发者模式,启动USB调试功能;</font>

        <font color='blue'>②</font> <font color='red' face='楷体'>需要开发在打包代码时,开启<font color='blue'>webview的debug属性setWebContentDebuggingEnabled(true)</font>;
</font>

             <font size='4'>但是,对于线上的开发包来说,一般都是把webview的debug属性关闭了的,从线上包,在桌面端,基本无法获取到hybird应用H5页面,但是,我们可以利用第三方工具强制开启webview的debug属性。这里,我使用的第三方工具是<font color='blue'>VirtualXposed</font>,安装这个工具后,需要安装<font color='blue'>WebviewDebugHook</font>这个模块才能正常使用</br>
</font>

             <font size='3' face = '楷体'><font color='red'>需要注意,VirtualXposed是才发布的一个软件,可能有一些bug。</font>VirtualXposed这个模块自带了root环境,可以在非root的环境下运行Xposed,免去了手机root的麻烦,其下载地址如下<font color='blue'>https://github.com/android-hacker/VirtualXposed/releases</font>,WebviewDebugHook的github地址如下<font color='blue'>https://github.com/feix760/WebViewDebugHook</font>。上述两个软件都只需要下载apk包即可(<font color='red'>如果使用Xposed,按安卓版本不同,会有两个版本的Xposed安装,在点击进入WebViewDebugHook的github下载地址后,在帮助文档中,有给适用于较低版本的Xposed的安装地址<font color='blue'>http://repo.xposed.info/module/de.robv.android.xposed.installer</font>,高版本地址在链接中有给出<font color='blue'>http://forum.xda-developers.com/showthread.php?t=3034811</font>。</font>)。需要注意的是,安装了VirtualXposed之后,进入软件后,VirtualXposed,会发现自动安装了Xposed,而在安装软件时,会有两个安装选项,一个是VirtualXposed,一个是安卓系统上,对于上面提到的<font color='red'>WebViewDebugHook模块,以及我们所需要使用的应用,都需要安装到VirtualXposed中</font>。安装好应用后,如下图所示:</br>
</font>

              <font size='3' face = '楷体'><font color='red'>注意:</font> 对于腾讯系的应用(比如<font color='red'>微信</font>,默认使用的是<font color='red'>X5内核</font>),不是谷歌浏览器的内核,在使用Xposed+WebviewDebugHook的情况下(<font color='red'>对于使用开启webview的debug属性的工程包或者VirtualXposed的环境,暂时不知道解决办法</font>),需要在手机根目录下建立一个debug.conf目录文本内容如下:</br>
</font>

    result_QProxy=false
    result_systemWebviewForceUsed=true
    setting_forceUseSystemWebview=true

<div align='center'>
<img src='https://i.loli.net/2018/04/14/5ad1fc2c1b11d.png' width='350' height='600' align=center />
</div>

        <font color='blue'>③</font> <font color='red' face='楷体'>电脑安装谷歌浏览器,在浏览器中输入<font color='blue'>chorome://inspect/#devices</font>,如下图所示,可以显示对应的H5页面的url地址,但是显示手机客户端的url地址,需要进行一些设置:</font>

             a)电脑需要能翻墙</br>

             b) 如果电脑翻墙后,仍然没有显示对应app的url,需要修改<font color='dark'>C:\Windows\System32\drivers\etc\hosts</font>

                         61.91.161.217 chrome-devtools-frontend.appspot.com

                         61.91.161.217 chrometophone.appspot.com
</font>

<div align='center'>
<img src='https://i.loli.net/2018/04/14/5ad1fe224d6c0.png' alt='利用谷歌浏览器成功获取到手机网页元素截图' width='600' height='300' align=center />
</div>

2.2.3 代码端进入H5视图界面

<font size="4">
        在代码端,进入H5视图之后,才能回H5元素进行操作,进入H5视图需要调用的语句是<font color='red'>driver.switch_to.context(webview视图)</font>,示例代码如下:(<font color='red'>上述代码需要在appium的14版本执行,在appium15版本,VirtualXposed中安装的软件会全部清空</font>)

conf = ConfigParser()
conf.read("app.conf")
desired_caps_right = eval(conf.get("app", "desired_caps_right"))

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps_right)
time.sleep(5)


def getSize():
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    return (x, y)

try:
    time.sleep(3)
    winSize = getSize()
    x1 = int(winSize[0] * 0.5)
    y1 = int(winSize[1] * 0.9)
    y2 = int(winSize[1] * 0.1)

    # 不能加时间,加了会有点击操作
    driver.swipe(x1, y1, x1, y2)
    time.sleep(1)
    
    # 找到柠檬班app位置,进入柠檬班app
    app_ele = driver.find_elements_by_id("io.va.exposed:id/icon")[0]
    app_ele.click()
    time.sleep(5)
    
    # 点击进入全程班
    qcb_ele = driver.find_element_by_xpath("//android.widget.TextView[@text=\'全程班\']")
    qcb_ele.click()

    time.sleep(3)
    # 打印contexts
    print(driver.contexts)

except Exception as e:
    print(e)
finally:
    driver.quit()

        contexts打印下图所示(其 <font color='blue' face='楷体'>格式为WEBVIRE_context名称</font>),该H5页面的context就是最后一项,需要注意的是,获取H5页面的context需要开发辅助进行一些设置,设置方式如下:

        <font color='blue'>①</font><font color='red' face='楷体'>需要开发在打包时,开启webview的debug属性<font color='blue'>setWebContentDebuggingEnabled(true)</font>;(这一步是获取url的必须项)</font>

        <font color='blue'>②</font><font color='red' face='楷体'>如果在手机模拟器中,可以打印该webview界面的context,但是在真机上没有,此时,手机需要root;(如果使用了VirtualXposed,自带root环境,也不需要进行设置)</font>
</font>

图2.4 contexts打印结果

2.2.4 操作H5视图界面元素

<font size="4">
        获取到Hybird应用H5页面的context后,可以通过<font color='red'>driver.switch_to.context("webview名")</font>进入H5页面的context,之后就可以在这个界面,通过web页面的定位方式对H5页面的元素进行操作,由于web页面,针对浏览器不同,会需要不同的驱动程序,非腾讯系应用,使用的是安卓自带的谷歌浏览器解析以及渲染页面的H5元素,所以需要安装一个对应版本的谷歌驱动,将这个chromedriver放在appium安装目录下的<font color='blue'>\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win</font>下。(我的安卓系统内核谷歌浏览器为53版本,对应的驱动为2.23版本,各版本谷歌浏览器对应驱动版本如下:<font color='red' face = '楷体'>https://blog.csdn.net/huilan_same/article/details/51896672</font>),总结查看手机对应的谷歌浏览器版本有如下方法:

        <font color='blue'>①</font><font color='red' face='楷体'> 在chrome://inspect/#devices中可以查看手机谷歌浏览器的版本;</font>

图2.5 在谷歌浏览器中显示手机谷歌浏览器版本

        <font color='blue'>②</font> (注意:这一操作在实操中并未找到)<font color='red' face='楷体'> 在appium控制台中可以显示当前系统webview的版本(<font color='blue'>搜索Webview version关键字</font>,结果如图2.6所示);</font>
</font>

<div>
<img src="https://i.loli.net/2018/04/15/5ad2a9044520f.png" width='500' />
</div>

<font size="4">
         <font face='楷体' color='red'>对于腾讯系机遇X5内核的应用,需要哪种驱动,笔者暂时不清楚,但找到一篇相关介绍的文章<font color='blue'>http://fantaxy025025.iteye.com/blog/2379692</font> 。
</font>

三、 appium操作H5元素代码示例

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.implicitlt_wait(30)

# 前期操作,进入H5视图界面
prep_ele = driver.find_element_by_xpath('//android.,widget.TextView[@text=\"全程班\"]')
prep_ele .click()
time.sleep(5)

# 打印H5界面的上下文
contexts = driver.contexts
print(contexts)

# 切换进webview视图
view_context = 'WEBVIEW_com.lemon.lemoonban' #view_context的值由contexts的打印中获取
driver.seitch_to.context(view.context)

# 操作H5页面元素
fav_button_id = 'js-bottom-fav'
driver.find_element_by_id(fav_button_id ).click()

# 切换回默认context
driver.switch_to.context(None)

        <font color='blue' size='4'>实际测试中,并没有点击到WebView中的收藏按钮,由于无法获取到该app开启Webview的debug属性的工程包,猜测是在VirtualXposed环境环境上点击H5元素有问题导致的。</font>

        <font color='blue' size='4'>尝试过使用夜神模拟器,开启root后,安装Xposed,并在Xposed中安装WebViewDebugHook模块模块,但在chrome端并不能获取到对应H5界面的url。</font>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容