本文内容在以下环境运行成功:

Windows10

Python2.7

android-sdk_r24.4.1

Appium-windows-1.15.1

chromedriver_2.40

小米手机

微信7.0.13(webview66.0.3359)

环境之前已经搭建好了,还没搭建好环境的看这里:

一、编写微信Native部分代码

可以用appium inspector录制微信Native部分代码,不会的看这:

我用例录制的步骤为,打开微信-->点右上角搜索按钮-->输入:测试工程师小站-->点击搜索结果中的公众号-->点击菜单:历史消息

以上部分代码为:

from appium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

desired_caps = {}

desired_caps['platformName'] = 'Android'

desired_caps['platformVersion'] = '9'

desired_caps['deviceName'] = '63fa4de5'

desired_caps['appPackage'] = 'com.tencent.mm'

desired_caps['appActivity'] = '.ui.LauncherUI'

desired_caps['noReset'] = 'True'

desired_caps['chromeOptions'] = {'androidProcess': 'com.tencent.mm:tools'}

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

wait=WebDriverWait(driver, 10)

# 打开微信需要一定时间,这里我们用显示等待,等搜索元素出现后再获取,后面代码大家自行根据需要添加

el1 = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/f8y')))

el1.click() # 点击搜索

time.sleep(1)

driver.find_element_by_id("com.tencent.mm:id/bhn").send_keys(u"测试工程师小站") # 输入名称

driver.find_element_by_id("com.tencent.mm:id/gbv").click() # 点击公众号

driver.find_element_by_id("com.tencent.mm:id/alv").click() # 点击一级菜单

# 点击二级菜单(历史消息)

el2 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[2]")

el2.click()

需要注意的是,微信的元素id每个版本不一样,也可能是每次安装卸载后就不一样了。

到此步微信打开了H5页面(webview),下面H5的自动化就和在PC上使用selenium自动化WEB一样了,接下来进行一些准备工作。

二、编写微信webview部分代码

开启微信debug模式

微信内置的浏览器,需要先开启调试功能。在微信上随便找个聊天栏,输入:http://debugx5.qq.com

勾选:打开TBS内核Inspector调试功能

在PC上,打开Chrome浏览器,输入:chrome://inspect/#devices

我们之前已经在微信上打开了H5页面,可以在PC Chrome页面上看到,并且看到微信webview的版本是66.0.3359

点击inspect,打开元素调试页面,和web是完全一样的。注意这个工具必须得番墙后才能用哦,我也不知道Google为啥不弄成本地的,还非得连他们家服务器。

左侧屏幕区域,支持鼠标滚轮和点击,可以同步操作手机。点上面的箭头(元素抓取工具)图标,再点H5上的元素,就在右侧上方定位元素,右侧下方可以写Xpath和CSS语句,来调试定位的准确性。

OK,我们继续编写H5页面的自动化代码,在打开的历史消息H5,点击第一篇文章,文章打开后点击页面最右下角的‘在看’按钮。

以上源码为:

driver.switch_to.context('WEBVIEW_com.tencent.mm:tools')

driver.find_element_by_xpath('//span[@class="weui_media_hd js_media"]').click() # 点击第一个历史消息

driver.find_element_by_xpath('//button[@id="js_like_btn"]').click() # 点击在看

chromedriver不一致的坑:

切context运行后报错,提示:

selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: A new session could not be created. Details: session not created: This version of ChromeDriver only supports Chrome version 76

微信里面的 webview 版本号和 chromedriver 的版本号有一个对应的关系,两者必须要匹配。

根据报错信息,在下面这个文件里有对应关系表:

C:\Users\XXXX\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\lib\chromedriver.js

其中有一行,'2.40': '66.0.3359'

这表明微信的webview版本66.0.3359对应的chromedriver应该是2.40

这里有所有的chromedriver历史下载

https://chromedriver.storage.googleapis.com/index.html

坑继续,我下载后将原有的

C:\Users\XXXX\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe

重命名成chromedriver_bak.exe,然后把下载的复制过来,运行,还是报错。看日志,appium竟然发现2个chromedriver,看来重命名不管用,把旧的移走,只留新的。

巨坑的是,运行依然报错,折腾了2小时,最后发现,我下载的是2.4,不是2.40,一个是版本四,一个是四十...

重新下载2.40,运行通过。

context搞错的坑:

之前我已经看过别人的文章,微信中有很多个context,做H5的话要这样:

在appium中context的切换时,识别webview的时候, 把com.tencent.mm:tools的webview识别成com.tencent.mm的webview. 从而导致context切换失败。

所以这里必须加上这个参数ChromeOptions,这个是关键。

desired_caps['chromeOptions'] = {'androidProcess': 'com.tencent.mm:tools'}

我拿我们公司的H5页面,是成功的。因为不方便展示,所以后来才换的微信公众号文章,但是微信公众号文章在这里是执行失败的。报错说H5上的元素没找到。

因为公司H5成功,微信公众号文章H5失败,所以我怀疑是context不对,在执行上下文切换时,先打印出所有的上下文

print(driver.contexts)

结果为:

[u'NATIVE_APP', u'WEBVIEW_com.tencent.mm:appbrand0', u'WEBVIEW_com.tencent.mm:toolsmp', u'WEBVIEW_com.tencent.mm', u'WEBVIEW_com.tencent.mm:tool']

继续查资料,在打开微信公众号历史的前提下,在CMD中输入:

adb shell dumpsys activity top | findstr ACTIVITY

可以看到微信的只有一个进程,pid为19295

接着输入: adb shell ps 19295

可以看到其进程名是

com.tencent.mm:toolsmp

所以可以看到,微信自家的H5和外链的H5,用的不是同一个webview

我们把配置改为

desired_caps['chromeOptions'] = {'androidProcess': 'com.tencent.mm:toolsmp'}

把切换context的代码改为

driver.switch_to.context('WEBVIEW_com.tencent.mm:toolsmp')

handle搞错的坑:

选对了context,但运行依然报错说找不到元素。因为之前准备功课时看到有人因为handle不对,所以找不到元素。handle可以理解成PC Chrome上的页签。

切换context后,打印所有handle:

hs = driver.window_handles

print hs

结果有4个handle:

[u'CDwindow-F9F8E326F86E25A8D42D015C7CE6BCB0', u'CDwindow-290B77B961BC04EE4F0CBAAC1A88DF02', u'CDwindow-39F2828759F3013A63BED60A6697F9EF', u'CDwindow-30357A847E5D5FF1FFEC6C06760052A6']

挨个试到第3个的时候成功了

driver.switch_to.window(hs[2]) # 转到第3个handle

print driver.current_url # 打印当前url

print driver.page_source # 打印页面页面源码

恩,打开那个url就是文章导航页面,源码里也有相应的元素。

然后我代码里写死了切第3个handle,即hs[2],运行又找不到元素了。坑爹,原来微信H5 handle列表数量和位置是会变的。

那就遍历handle,哪个里面有历史文章名‘界面通用测试用例’(页面上可定位的元素),那就对了。

hs = driver.window_handles

print hs

for handle in hs:

driver.switch_to.window(handle)

url = driver.current_url

print url

if u'界面通用测试用例' in driver.page_source:

break

OK,上面已经能成功打开历史文章中的第一篇,但是在点文章的‘在看’时,又找不到元素了,恩,我一下就想到,又打开的文章就是另一个handle了,如上遍历一下,就可以找到。

最终运行成功,演示视频(其中有2处很慢,是在遍历handle):

全部代码为:

#coding=utf-8

from appium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

import time

import sys

reload(sys)

sys.setdefaultencoding('utf8')

desired_caps = {}

desired_caps['platformName'] = 'Android'

desired_caps['platformVersion'] = '9'

desired_caps['deviceName'] = '63fa4de5'

desired_caps['appPackage'] = 'com.tencent.mm'

desired_caps['appActivity'] = '.ui.LauncherUI'

desired_caps['noReset'] = 'True'

desired_caps['chromeOptions'] = {'androidProcess': 'com.tencent.mm:toolsmp'}

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

wait=WebDriverWait(driver, 10)

# 打开微信需要一定时间,这里我们用显示等待,等搜索元素出现后再获取,后面代码大家自行根据需要添加

el1 = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/f8y')))

el1.click() # 点击搜索

time.sleep(1)

driver.find_element_by_id("com.tencent.mm:id/bhn").send_keys(u"测试工程师小站") # 输入名称

driver.find_element_by_id("com.tencent.mm:id/gbv").click() # 点击公众号

driver.find_element_by_id("com.tencent.mm:id/alv").click() # 点击一级菜单

# 点击二级菜单(历史消息)

el2 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[2]")

el2.click()

time.sleep(3)

# print(driver.contexts)

driver.switch_to.context('WEBVIEW_com.tencent.mm:toolsmp')

# 遍历历史消息页面的handle

hs = driver.window_handles

print hs

for handle in hs:

driver.switch_to.window(handle)

url = driver.current_url

print url

if u'界面通用测试用例' in driver.page_source:

break

driver.find_element_by_xpath('//span[@class="weui_media_hd js_media"]').click() # 点击第一个历史消息

time.sleep(3)

# 遍历文章页面的handle

hs = driver.window_handles

print hs

for handle in hs:

driver.switch_to.window(handle)

url = driver.current_url

print url

if u'历史文章推荐阅读' in driver.page_source:

break

driver.find_element_by_xpath('//button[@id="js_like_btn"]').click() # 点击在看

利用python生成微信h5_Python + Appium 微信公众号 H5 页面自动化测试相关推荐

  1. 微信公众号H5页面开发--微信JS-SDK引用

    微信公众号H5页面开发–微信JS-SDK引用 微信提供了微信公众号开发者手册,官方地址:https://mp.weixin.qq.com/ 公众号内许多复杂的业务场景,都是通过网页形式来提供服务,这时 ...

  2. 前端实现微信公众号h5页面跳转小程序-成功案例

    微信公众号h5页面跳转小程序-成功案例 微信公众号h5页面跳转小程序-成功案例,标题已经明确说明,h5页面可以正常跳转微信小程序 官网说可以,不是我说的 文章目录 微信公众号h5页面跳转小程序-成功案 ...

  3. 微信公众号h5页面跳转小程序

    微信公众号h5页面跳转小程序 文章目录 微信公众号h5页面跳转小程序 前言 一.注意 二.使用步骤 步骤一:绑定域名 步骤二:引入环境 步骤三:初始配置 前言 问:h5 页面可以跳转至微信小程序吗? ...

  4. 微信公众号H5页面开发怎么获取用户openid

    微信公众号里会嵌套h5页面然后跳转,有时候我们就需要用到用户的openid,今天就为大家介绍一下公众号h5页面怎么获取openid 首先,需要用到公众号的appid,其次需要去公众号里配置好h5页面的 ...

  5. 公众号h5页面跳转到小程序

    前言: 最近做了一个公众号的首页,首页由一个模块需求是点击跳转到小程序,于是翻阅了资料,需要用到公众号的一个开放标签:wx-open-launch-weapp 公众号h5页面跳转小程序呢,需要先关联下 ...

  6. RTFM:腾讯微信公众号H5页面使用微信支付爬坑记

    一. 微信公众号支付的流程 公众号的页面会在微信环境下打开,所以默认已经有登录态.openID.AppID.AppSecret 都能拿到,申请开通商家支付之后会有 PayKey 和 mch_id (商 ...

  7. 公众号h5页面分享并监测分享事件

    公众号H5中需要做分享任务,需要监听分享成功事件,实现代码 <template><div @click="toShare">111</div> ...

  8. 微信公众号H5页面实现扫一扫功能

    uniappH5实现扫一扫功能 最近遇到一个需求,H5页面使用扫码绑定设备功能,因为uniapp uni.scanCode API H5不支持,网上找了很多方案不合适,因为这个项目是在公众里面运行的, ...

  9. 微信公众号H5页面支付JSAPI

    1:在微信环境下,我们需要获取到code,拿code去获取openid,在获取openid的时候有2种参数分别是:snsapi_base和snsapi_userinfo,snsapi_base只为获取 ...

最新文章

  1. 【转载】xmind的使用安装方法
  2. VirtualBox Linux Samba 设置
  3. matlab变量代替语句,MATLAB只是简单地把表达式里的变量名替换成数值,而不给出结果...
  4. linux 运行c b停止,以下Linux命令中,用于终止某个进程的命令是()。A.deadB.killC.quitD.exit...
  5. ASP金额转人民币大写的函数
  6. 阿里巴巴测试相关内容
  7. win11HDMI端口无法使用怎么办 windows11HDMI端口无法使用的解决方法
  8. Qt控件总结:QToolButton
  9. Android Button常用属性
  10. 山科大离散数学期末考试_离散数学期末考试试题及答案
  11. 【Python_绘图】堆积柱形图
  12. 内部敌人中文 android,幽浮:内部敌人(含数据包)
  13. ADO编程详解(C++)
  14. exe后门程序生成之Quasar
  15. 前端,网页设计常用色彩搭配表
  16. 沟通的艺术:看人入里,看出人外 - part 5
  17. 教师计算机西沃培训心得,学习使用希沃电子白板的心得体会
  18. linux版360浏览器下载
  19. 每日一句—英语长难句
  20. 工厂方法模式(雷锋依然在人间)

热门文章

  1. UVa:10105 Polynomial Coefficients(多项式定理)
  2. 光纤布拉格光栅(FBG)笔记【2】:反射率
  3. 小游戏 《唐僧大战白骨精》
  4. PADS导入【ORCAD原理图文件】【导入ORCAD16.3原理图】 【layout如何进行“ECO对比更新”】【打开文件出错:*因为当前设计处于默认层模式下........】
  5. 百万点赞怎么来?Python批量制作抖音的卡点视频原来这么简单!
  6. Python全栈工程师之从网页搭建入门到Flask全栈项目实战(3) - 入门Flask微框架
  7. win10 premiere cc 软件无声音解决办法
  8. uni app中使用图表
  9. 平板电脑:apple、中国挑大梁
  10. 5.0 数据库完整性详解(PRIMARY KEY、REFERENCES、CHECK、CONSTRAINT、DOMAIN、TRIGGER)