接口测试 完美解决 请在微信客户端打开链接

K米测试 · 2017年11月23日 · 最后由 扮猪吃老鼠 回复于 2017年12月17日 · 8984 次阅读
本帖已被设为精华帖!

完美解决 请在微信客户端打开链接

背景描述

-w272
相信有模拟微信页面请求的测试都有看到过这个页面,简单点说就是爬虫爬微信页面,进行回放的时候会出现这个页面。大概在 1 年前,专门安排了一个人去解决这个技术问题,遗憾的是当时没有找到解决方案,接下来所有微信端的接口测试和性能测试都无法进行,今天和大家分享下我们的解决方案,希望大家可以绕过微信的坑。

业务场景

我这里以 JMeter 来举例,我们可以通过在 JMeter 上开启代理,手机上设置代理来录制微信端的请求,以下为在微信端的业务对应生成的脚本:
-w800

录制完成后,我们进行回放,你会发现在查看结果树中,会重定向到微信授权,接着就开始提示:请在微信客户端打开链接。
-w800

这里补充几个录制的小技巧

-w800
1、每个组放入一个新的控制器:在手机端上做的一次操作所产生的请求会被放在一个控制器中,非常方便;
2、选中记录 HTTP 信息头、添加断言、Regex matching :自动添加信息头和断言;

问题分析

这里我们看一下请在微信客户端打开链接页面对应的代码:

<script type="text/javascript">
            var ua = navigator.userAgent.toLowerCase();
            var isWeixin = ua.indexOf('micromessenger') != -1;
            var isAndroid = ua.indexOf('android') != -1;
            var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
            if (!isWeixin) {
                document.head.innerHTML = '<title>抱歉,出错了</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0"><link rel="stylesheet" type="text/css" href="https://res.wx.qq.com/open/libs/weui/0.4.1/weui.css">';
                document.body.innerHTML = '<div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_info weui_icon_msg"></i></div><div class="weui_text_area"><h4 class="weui_msg_title">请在微信客户端打开链接</h4></div></div>';
            }
        </script>

重点看:

var ua = navigator.userAgent.toLowerCase();
var isWeixin = ua.indexOf('micromessenger') != -1;

说明微信的这个提示是通过判断 userAgent 中是否包含micromessenger确认是否从微信中打开。
好了,我们查看以下 HTTP 头中的 userAgent:
-w800

录制的时候自动添加了录制 HTTP 请求头的,那么为什么在 JMeter 打开会仍然会提示呢?这里怀疑是微信故意留的坑或者是微信开发这个页面的人英语四级没过。

解决方案

经过和我们程序猿哥哥陈丹明陈建清一番讨论,一开始没有解决方案;此时丹明怀疑 MicroMessenger 这个单词写错了,应该是:micromessage!一试,果然!
好吧,程序猿你赢了,看来懂英语是多么的重要。

最终解决

在 HTTP 请求头里面将MicroMessenger修改成 micromessage
-w800

小结

1、请在微信客户端打开链接 这个问题困扰了我们很久,今天总算解决,完美解决;
2、感谢程序猿的大胆怀疑,给他们点赞;
3、自动化测试过程中如果碰见了技术瓶颈,不妨多和研发沟通,他们总能给你一些指导。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

前段时间 ,我还 发了提问帖,也没解决~~~
收藏先~后面看~

白纸 回复

完美解决,希望对你有用

为什么同样是错的,手机端不提示呢。

nicman 回复

这个就得问微信了

请问一下,这里到底是写的 micromessage 还是 micromessager 啊?
我看你上面的代码里是 micromessager
但是下面说的是替换成 micromessage

多谢

@aizaimenghuangu 这个是微信那边单词写错了吗? 我按这个方法改了 user-agent 里的单词,发送报文后还是提示要我到微信端打开。。

Mingway_Hu 将本帖设为了精华贴 12月15日 14:48
白虹李李 回复

是:micromessage

jh 回复

要看你的请求是什么,有 2 种情况:
1、单纯的访问页面,则修改成:micromessage 就好;
2、在访问页面之前需要进行授权登录,则需要和你们的研发沟通下具体的业务逻辑;

K米测试 回复

谢谢😆 确实是逻辑问题

真的么。。。。。。😂

13楼 已删除
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册