微信小程序自动化测试调研记录

XTEST:
https://www.cnblogs.com/Test-xiaobai/p/9066331.html
APPIUM:
python摩拜:https://www.cnblogs.com/yoyoketang/p/9144987.html
java美团:https://testerhome.com/topics/7053
https://blog.csdn.net/windanchaos/article/details/70210341
https://testerhome.com/topics/14552
https://www.cnblogs.com/ai594ai/p/8615835.html
https://testerhome.com/topics/15479 近期
https://www.cnblogs.com/yyoba/p/9455519.html
https://mp.weixin.qq.com/s/U0jFiRsVsChHb8K9995QKQ
https://testerhome.com/topics/6954
AIRTEST:
https://testerhome.com/topics/14736
pocoui:
https://poco.readthedocs.io/en/latest/source/doc/poco-example/play_with_unittest_framework.html
https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html

调试腾讯tbs的webview:
https://www.jianshu.com/p/e62e99050084
腾讯tbs文档
https://x5.tencent.com/tbs/guide/debug/season7.html
http://bbs.mb.qq.com/thread-1945940-1-1.html
https://testerhome.com/topics/7112

appium测试混合应用原理:http://appium.io/docs/cn/advanced-concepts/chromedriver/

chrome和chromedriver版本关系:
官网查看支持版本:http://chromedriver.chromium.org/downloads
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md
chromedriver下载:http://chromedriver.storage.googleapis.com/index.html

image.png

导入poco.drivers提示no module

原因是只装了poco,没有安装pocoui,安装后解决

微信获取contexts,只有app_native,没有webview

微信打开debugx5.qq.com,切换到信息,打开tbs调试模式

微信打开debugx5.qq.com,提示不是x5内核

暂未解决

appium获取微信小程序元素获取问题。

只有find_element_by_accessibility_id有效,find_element_by_class_name无效。暂未解决,可能需要切换到webveiw

切换微信webveiw时,chrome not reachable

[debug] [JSONWP Proxy] Got response with status 200: {"sessionId":"d1a6d9df13b1023338b6405fe87ac6be","status":100,"value":{"message":"chrome not reachable\n (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 6.1.7601 SP1 x86_64)"}}
可能原因是chromedriver版本与微信webveiw版本不一致?注意不是手机里chrome浏览器的版本,是微信webview使用的chrome内核版本。

如何查看微信webview版本

微信浏览器打开网页,抓useragent,如User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; vivo Y66 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044207 Mobile Safari/537.36 MicroMessenger/6.7.2.1340(0x2607023A) NetType/WIFI Language/zh_CN

查看appium使用的chromedriver版本

查appium的日志,有C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win,要替换的话,直接下载然后放到该目录

chromedriver版本与微信webview已经一致,还是报chrome not reachable

pc的chrome浏览器,输入chrome:inspect,已经可以看到微信webview打开的页面


image.png

关于chrone not reachable

https://github.com/appium/appium/issues/9469
https://github.com/appium/appium/issues?utf8=%E2%9C%93&q=reachable
https://stackoverflow.com/questions/48310994/cannot-set-context-to-webview
https://github.com/appium/appium/issues/8958
https://testerhome.com/topics/15479
https://testerhome.com/topics/16226
有的说是因为没有设置Capabilities.SetCapability("chromeAndroidPackage", "app_package_name")导致,但这个bug已经修复,而且我也加了。
https://github.com/appium/appium/issues/8032
https://github.com/appium/appium-android-driver/pull/243

image.png

同样的环境,换了一台小米6,居然能切换成功了,无奈了。之前是vivo y66

切换到webview后报:unable to discover open pages

有说是options.add_experimental_option('androidProcess', 'com.tencent.mm:tools')这个设置不对,但未解决
https://github.com/appium/appium/issues/8032
有说得加--no-sandbox,添加后解决问题,但是仍然无法find element by class name

        desired_caps = {
                'platformName': 'android',
                'deviceName': 'vivo Y66',
                'appPackage': 'com.tencent.mm',
                'appActivity': '.ui.LauncherUI',
                'automationName': 'appium',
                'unicodeKeyboard': True,
                'resetKeyboard': True,
                'noReset': True,
                'newCommandTimeout': 600,
                'chromeAndroidPackage': 'com.tencent.mm',
                'recreateChromeDriverSessions': True,
                'chromeOptions':
                    {'androidProcess': 'com.tencent.mm:tools',
                     'args': ['--no-sandbox']
                    }
                }

https://stackoverflow.com/questions/21001652/chrome-driver-error-using-selenium-unable-to-discover-open-pages

遇到一种情况是微信没有打开H5页面也会报这个,当我打开一个页面的时候,一会就切换成功了

切换webview后仍然无法操作元素

不管是找什么元素,都找不到,看到driver有一个page_source接口,返回如下:

driver=webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.contexts
['NATIVE_APP', 'WEBVIEW_com.tencent.mm:tools', 'WEBVIEW_com.tencent.mm:toolsmp']
>>>driver.switch_to.context(u'WEBVIEW_com.tencent.mm:tools')
>>>driver.page_source()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object is not callable
>>>driver.page_source
'<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" ......

appium返回的response如下:

[debug] [JSONWP Proxy] Proxying [GET /wd/hub/session/572ece24-a830-40f5-b684-2dfc3f067e28/source] to [GET http://127.0.0.1:8000/wd/hub/session/ed760fbb7208051a2fad2e9d299cd690/source] with body: {"sessionId":"572ece24-a830-40f5-b684-2dfc3f067e28"} [debug] [JSONWP Proxy] 
Got response with status 200: "{\"sessionId\":\"ed760fbb7208051a2fad2e9d299cd690\",\"status\":0,\"value\":\"\\u003C!DOCTYPE html>\\u003Chtml xmlns=\\\"http://www.w3.org/1999/xhtml\\\" style=\\\"text-size-adjust: 100%;\\\">\\u003Chead>\\n    \\u003Cscript type=\\\"text/javascript\\\">\\n        var points = [];\\n        points[0] = new Date().getTime();\\n        var oldPoint = [];\\n        oldPoint[0] = new Date().getTime();\\n    \\u003C/script>\\n    \\u003Cmeta charset=\\\"UTF-8\\\" />\\n    \\u003Ctitle>搜一搜\\u003C/title>\\n    \\u003Cmeta name=\\\"format-detection\\\" content=\\\"t
elephone=no\\\" />\\n    \\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\\\" />\\n    \\u003Clink rel=\\\"stylesheet\\\" type=\\\"text/css\\\" href=\\\"dist/style.css?t=1535632682922\\\" />\\n\\u003C/head>\\n\\n\\u003Cbody id=\\\"body\\\" ontouchstart=\\\"\\\">\\n    \\u003Cdiv id=\\\"search_test\\\" class=\\\"weui-cells\\\" style=\\\"display:none;margin:0;z-index: 99\\\">\\n

初步看里面的内容,看起像是一个网页,之前用chrome inspct,看到过这个搜一搜,所以怀疑是切错webview了,这个webveiw应该是微信打开H5页面时用的webview。如下图所示:


image.png
>>>driver.get("http://m.baidu.com")
>>>driver.page_source
'<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" class

确实能打开百度网页,但就是在手机端看不到页面


img

查看当前窗口,然后切换,发现切换是成功的,只是不能在手机上显示

>>>driver.window_handles
['CDwindow-56b52630-ffcc-4b1f-88cc-c26d4b5e10ed', 'CDwindow-3168289f-c448-4597-bf21-cf825fd29b5c', 'CDwindow-4a0d4647-27a5-4cfa-92a7-357ee6901c2a']
>>>driver.switch_to.window('CDwindow-3168289f-c448-4597-bf21-cf825fd29b5c')
>>>driver.current_window_handle
'CDwindow-3168289f-c448-4597-bf21-cf825fd29b5c'
>>>driver.title
'中国新说唱官方投票通道'
>>>driver.switch_to.window('CDwindow-4a0d4647-27a5-4cfa-92a7-357ee6901c2a')
>>>driver.title
''
>>>driver.switch_to_window('CDwindow-56b52630-ffcc-4b1f-88cc-c26d4b5e10ed')
>>>driver.title
'百度一下'

看了下,有的人获取的context有很多,比如:

也许真的是微信更新后,无法获取小程序的webview了
https://testerhome.com/topics/14770

image.png

image.png

另一提到更新导致无法切换的:
https://testerhome.com/topics/8990

image.png

于是去安智市场或豌豆荚下载了一个2017年1月6号版本6.5.3,安装后,利用chrome://inspect可以看到小程序相关的webview。再之前的版本不行,因为还没有小程序入口。

操作:
下载6.5.3安装,打开debugx5.qq.com,提示不是x5,要安装tbs内核,点链接安装,安装后再打开(需要等一会e),切到信息栏,把inspect勾选。再重启微信打开小程序,发现chrome inspect成功,重启微信很重要

image.png

在安智市场可以下载微信历史版本
3月21日版本6.5.6,ok
3月30日版本6.5.7,ok
7月6日版本6.5.10,ok
9月30日版本6.5.16,ok
12月25版本6.6.0,ok
201803月6日6.6.5,ok
6月11日版本6.6.7,切换context报错chrome not reach able。将androidProcess换为com.tencent.mm:tools后可以切换成功,但不是小程序的。chrome:inspect也失败。androidProcess如何确定,见下面
4月11日版本6.6.6,chrome:inspect失败,报错chrome not reach able

看来就是666版本开始的,我们搜索一下微信6.6.6版本的更新记录日志。发现只有一条,可保留未编辑完的朋友圈...
再去看看小程序的更新日志
https://developers.weixin.qq.com/miniprogram/dev/framework/release.html
https://developers.weixin.qq.com/miniprogram/dev/framework/release/v1.html
也没发现什么相关的。

那目前就这样了,想要小程序的自动化,必须安装6.6.5版本的微信。

image.png

点击inspect后可以成功,只不过是左边没有预览画面,后来发现高版本的6.6.0后能预览了

然后再重新用appium跑,代码如下:

from appium import webdriver
desired_caps = {
                'platformName': 'android',
                'deviceName': 'vivo Y66',
                'appPackage': 'com.tencent.mm',
                'appActivity': '.ui.LauncherUI',
                'automationName': 'appium',
                'unicodeKeyboard': True,
                'resetKeyboard': True,
                'noReset': True,
                'newCommandTimeout': 600,
                'chromeAndroidPackage': 'com.tencent.mm',
                'recreateChromeDriverSessions': True,
                'chromeOptions':
                    {'androidProcess': 'com.tencent.mm:appbrand0',  
                     'args': ['--no-sandbox']
                    }
                }
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.contexts # ['NATIVE_APP', 'WEBVIEW_com.tencent.mm:tools', 'WEBVIEW_com.tencent.mm:appbrand0']
print(driver.page_source)
driver.switch_to.context(u'WEBVIEW_com.tencent.mm:tools')

总结几点:

  • androidProcess如何确定
$ adb shell
# 打开小程序,然后输入以下命令查看当前活动的进程号
shell@PD1621:/ $ dumpsys activity top|grep ACTIVITY
  ACTIVITY com.tencent.mm/.plugin.appbrand.ui.AppBrandInToolsUI ad729c6 pid=28902
# 查看当前进程号的进程信息,进程名。

shell@PD1621:/ $ ps 28902
USER      PID   PPID  VSIZE  RSS   WCHAN            PC  NAME
u0_a227   28902 669   1900832 246896            00000000 R com.tencent.mm:tools
shell@PD1621:/ $

这个值是哪个应该是与打开方式有关,比如从首页下拉进的小程序,一般是appbrand0,从搜索的搜一搜入口进的是toolsmp等,也有时候是tools。可能与第一次打开的时候操作顺序有关。
6.6.5是tools,升级到6.7.3后是toolsmp(从搜一搜进去),退出登录后,搜一搜入口也无法切webview了,只能升级到6.7.3才行。不知道为什么。

  • 出来的两个WEBVIEW,切换到哪个效果是一样

进展到这,以为离成功不远了,没想到后面还是一堆的问题

无法找到对应的元素,no such element

# 查找div貌似正常,但这个div元素是空的,什么都没有
driver.find_element_by_tag_name("div")  #正常
# 其他的查找方法都是报错找不到
driver.find_element_by_tag_name("wx-view") 
div.find_element_by_class_name("c-icon-search") 
div.find_element_by_class_name("//*[@class='c-icon-search']") 
div.find_element_by_xpath("//*[contains(@text, '上升榜')]") 

在chrome inspect里面试了下xpath,是没问题的


image.png

于是打印了一下driver.page_source,发现这个page_source很特殊,有点像乱码,可能小程序代码编译后就是这样子?

image.png

把这字符串,粘贴到文本编辑器里,然后稍微处理了下,将\n转为换行符,将\t变为4个空格,将'变为',处理完后用chrome打开是个空白页。


image.png

尝试了chrome和火狐都无法正常显示。所有元素相关的都在<script>标签里,大概是这个是源代码,在driver里并没有得到真正的执行,所以查找元素都是失败,但是有个div的标签。那为什么driver里没有执行,只是一坨script代码???

然后再看看chrome:inspect里,发现有两个页签,也就是打开了两个页面,inspect第一个,发现跟我获取的page_source是一样的,一坨js代码,没有生成元素,inspect第二个发现是有元素的。所以在driver里切换了一下window_handle

>>>driver.window_handles
['CDwindow-d91965e5-b473-4a5a-9448-36cc3129254a', 'CDwindow-41e4c376-ebb9-4fd1-accd-e0611cf9ea0d']
>>>driver.current_window_handle
'CDwindow-d91965e5-b473-4a5a-9448-36cc3129254a'
>>>driver.switch_to_window( 'CDwindow-41e4c376-ebb9-4fd1-accd-e0611cf9ea0d')
>>>driver.page_source
'<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"
>>>driver.find_element_by_class_name("c-icon-search")
<appium.webdriver.webelement.WebElement (session="748fec7a-fc1d-489a-a1ea-4c36650b228a", element="0.969712313378926-1")>
>>>driver.find_element_by_class_name("c-icon-search").click()

switch_to.window()报'name' must be a string

appium1.9的问题,降级到1.7.2解决

如何操作input输入内容

看小程序代码里是<input>标签,但是渲染后变为了<wx-input>,获取元素后send_keys一直不行


image.png

image.png
>>>wxinput = driver.find_element_by_xpath("//wx-input")
>>>wxinput .get_attribute("data-defaultkey")
'延禧攻略'
>>>wxinput.send_keys("haha")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "E:\pyvenv\wx-uiauto\lib\site-packages\selenium\webdriver\remote\webelement.py", line 479, in send_keys
    'value': keys_to_typing(value)})
  File "E:\pyvenv\wx-uiauto\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "E:\pyvenv\wx-uiauto\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "E:\pyvenv\wx-uiauto\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response
    raise wde
  File "E:\pyvenv\wx-uiauto\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response
    super(MobileErrorHandler, self).check_response(response)
  File "E:\pyvenv\wx-uiauto\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element
  (Session info: chrome=57.0.2987.132)
  (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 6.1.7601 SP1 x86_64)

adb自动化输入中文问题

adb默认不支持uicode,所以用adb shell input text "哈哈"是无法输入的。解决办法查看以下文章
https://www.cnblogs.com/yoyoketang/p/8998789.html
ADBKeyBoard输入法下载:
https://github.com/wangshub/Douyin-Bot/blob/master/apk/ADBKeyBoard.apk

window handle多个之间的切换问题

小程序里,每打开一个页面,会多一个window_handle,但是并不会自动切换,目前能想到的笨办法是,找一个能标识每个页面的唯一性元素,然后遍历每个页签,如果page_source有该元素,则切到该页签,这个方法非常慢


image.png

也可以每次遍历确认window_handle和页面的对应关系后,就保存到一个字典里,这样切不同的页面就可以直接切?

java版报错:

        try{
            AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), caps);
        } catch(Exception e) {
            System.out.println("create driver error");
        }

报错如下:

java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.toImmutableSet()Ljava/util/stream/Collector;

    at org.openqa.selenium.remote.ProtocolHandshake.streamW3CProtocolParameters(ProtocolHandshake.java:262)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:142)
    at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:69)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:646)
    at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:51)
    at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:255)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:237)

开始的时候,caps.setCapability(ChromeOptions.CAPABILITY, options2);也报这个错,然后换了个selenium的版本,从3.14.0降低到3.5.0后解决了。但是这个appium的错误,从6.0降低到3.0还是没解决

新版本的自动化问题

微信从6.6.6版本后,小程序的调试入口被封,但无疑间发现从搜索入口进入小程序,仍然可以chrome:inspect,比如搜一搜,搜索爱奇艺,点击小程序打开,这时候可以。
但是从6.7.3开始,vivo y66连这个入口也被封了。但小米6新安装可以。vivo手机从6.6.5升级到6.7.3又可以,比较奇怪。

appium启动方式:

https://m.aliyun.com/jiaocheng/551181.html
https://www.cnblogs.com/testway/p/8177278.html
https://github.com/appium/java-client/blob/master/src/main/java/io/appium/java_client/service/local/AppiumDriverLocalService.java

FAtest框架

https://blog.csdn.net/qq_39745963/article/details/84337441?tdsourcetag=s_pcqq_aiomsg
https://cloud.tencent.com/developer/article/1132257
https://testerhome.com/topics/17037

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

推荐阅读更多精彩内容