appium操控微信小程序的坑
appium操控微信小程序的坑
- 打不开启动页面
- driver的context只有NATIVE_APP
- 小程序上元素找不到
我打算使用appium操控微信小程序,只要能够获取到小程序的页面元素就算成功。下面都是我遇到的问题。
打不开启动页面
以下是我的appium的配置参数和代码:
desired_caps = {'platformName': 'Android','platformVersion': '10','automationName': 'uiautomator2','deviceName': 'E3LBB20402214821','appPackage': 'com.tencent.mm','appActivity': '.ui.LauncherUI','noReset': True,'chromedriverExecutable': 'D://selenium//86.0.4240.22//chromedriver.exe','shouldTerminateApp':True,'showChromedriverLog': True,
}# 指定Appium Server
server = 'http://127.0.0.1:4723'
# 新建一个driver
options = AppiumOptions()
options.load_capabilities(desired_caps)
driver = webdriver.Remote(server, options=options)print("正在打开微信呢...")driver.implicitly_wait(5)driver.find_element(AppiumBy.XPATH, '//*[@text="通讯录"]')
print("打开微信成功...")
启动appium:
appium -g C:\Users\resus\Desktop\a.txt
C:\Users\resus\Desktop\a.txt 是日志的目录。
现象:
微信没有打开,直接就定位通讯录。
日志:

查找问题:

他说微信已经启动了,我根本没启动啊。按照他的提示,设置一个参数:
'forceAppLaunch': True
这样就可以打开微信了。
driver的context只有NATIVE_APP
代码:
size = driver.get_window_size()
driver.swipe(size['width'] * 0.5, size['height'] * 0.4, size['width'] * 0.5, size['height'] * 0.9)driver.find_element(AppiumBy.XPATH, '//*[@text="球场预定"]')print("driver context", driver.contexts)
print(driver.current_context)# 打开小程序
driver.find_element(AppiumBy.XPATH,'//*[@content-desc="球场预定,"]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]').click()
print("driver context", driver.contexts)
print(driver.current_context)time.sleep(10)
print("driver context", driver.contexts)
print(driver.current_context)
小程序是运行在谷歌浏览器里面的,是一个进程,这种也叫webview。你要获取里面的元素,得把上下文从微信迁到小程序。
现象:
我打印的结果:
driver context ['NATIVE_APP']
NATIVE_APP
driver context ['NATIVE_APP']
NATIVE_APP
driver context ['NATIVE_APP']
NATIVE_APPProcess finished with exit code 0
这样就没有办法操作小程序。
日志:

根本就没有一个webview。
我这里的问题是:没有打开debug模式。
解决:
在微信app中打开http://debugxweb.qq.com/?inspector=true,开启debug模式。
如何检验是否开启?
在谷歌浏览器中输入:chrome://inspect/#devices。在微信上打开一个小程序,如果浏览器能够检测到,那就说就说明微信已经开启了debug模式。

再次运行。
此时就有很多webdriver的context打印出来:
driver context ['NATIVE_APP', 'WEBVIEW_com.tencent.mm:appbrand2', 'WEBVIEW_com.tencent.mm:appbrand0', 'WEBVIEW_com.tencent.mm']
我们切换到小程序的进程,就可以拿到它的页面源码了:
driver.switch_to.context("WEBVIEW_com.tencent.mm:appbrand0")print("page source:", driver.page_source)
小程序上元素找不到
如果page_source打印出来没有问题,但是依旧定位不了元素,可能是以下原因:
- 等我们进入到小程序的上下文了,元素定位的时候,有件事情要注意,就是要用selenium的XPATH来定位,不要用appium的:
from selenium.webdriver.common.by import Bydriver.find_element(By.XPATH,'xxxxxxxxxx')
把webview想成是PC的页面就行。
- 隐式等待打开,这个确保找不到元素是其他原因:
driver.implicitly_wait(30)
- 如果还是找不到元素,那可能是window不对。打印一下窗口有几个,每个窗口都去试一下。
print("window_handles:", driver.window_handles)for window in driver.window_handles:try:driver.switch_to.window(window)print("current window:", driver.current_window_handle)print("current url:", driver.current_url)print(driver.find_element(By.XPATH, '//*[@id="fb-main"]/wx-view/wx-view[1]/wx-view[2]/wx-fb-common/wx-fb-base-button/wx-view/wx-van-button/wx-button/wx-view').text)except Exception as e:print(e)
相关文章:
appium操控微信小程序的坑
appium操控微信小程序的坑 打不开启动页面driver的context只有NATIVE_APP小程序上元素找不到 我打算使用appium操控微信小程序,只要能够获取到小程序的页面元素就算成功。下面都是我遇到的问题。 打不开启动页面 以下是我的appium的配置参数和代码: de…...
6 个最佳 Windows 免费磁盘分区管理器
几乎所有新的笔记本电脑和 PC 都只有一个分区 C:\,与安装了 Windows 的分区相同。不太精通技术的用户开始按照计算机呈现给他们的方式使用计算机;他们将所有文档、个人文件(例如图片、歌曲、电影等)放在同一个分区上。整个驱动器上…...
【Leetcode】【每日一题】【简单】2558. 从数量最多的堆取走礼物
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/take-gifts-from-the-richest-pi…...
LeetCode 每日一题 2023/10/23-2023/10/29
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/23 2678. 老人的数目10/24 1155. 掷骰子等于目标和的方法数10/25 2698. 求一个整数的惩罚数10/26 2520. 统计能整除数字的位数10/27 1465. 切割后面积最大的蛋糕10/28 2…...
Android:Installed Build Tools revision 33.0.2 is corrupted.
Remove and install again using the SDK Manager. 使用33.0.2及以上版本的build-tools编译Android应用时。 有些人会按照提示去SDK Manager中重新安装build tools,然后发现这样做是无用的 编译时会收到:Build-tool 33.0.2 is missing DX at D:\Sdk\b…...
语法复习之C语言与指针
内存是如何存储数据的? 在C语言中定义一个变量后,系统就会为其分配内存空间。这个内存空间包括了地址和长度。将变量赋值后,该值就被写入到了指定的内存空间中。内存空间的大小一般以字节作为基本单位。 普通变量存放的是数据,…...
vue笔记(二)
7、事件处理 7.1、事件的基本处理 事件的使用 使用v-on:xxx或者用xxx绑定事件,其中XXX是事件名事件的回调需要配置在methods对象中,最终出现在VM上methods配置的函数,不需要箭头函数 <div id"root"><h1>…...
【IT行业就业前景广阔:探讨热门方向与就业机会】
IT行业哪个方向比较好就业? IT行业是一个快速发展的领域,与许多其他行业紧密结合,为各个行业带来了巨大的变革和机遇。在这个充满活力的行业中,有许多就业方向可以选择。让我们一起来探讨一下IT行业的发展背景、就业方向以及分享一些就业经…...
linux上java -jar方式运行项目及输出文件nohup.out的清理, linux上定时器的用法
linux上java -jar方式运行项目及输出文件nohup.out的清理, linux上定时器的用法 linux上java -jar方式运行定期自动清理nohup.out文件的内容**验证**定时器crontab使用时注意事项 linux上java -jar方式运行 参考:https://blog.csdn.net/qq_42169450/arti…...
macOS 12 Monterey v12.7.1正式版:开启全新的操作系统体验
macOS 12 Monterey已经向所有兼容的Mac设备推出,为您带来了一系列强大的新功能和改进。这个全新的操作系统版本,不仅带来了更流畅的用户体验,还增强了与iOS设备的无缝集成,让您的设备使用更加高效,更加便捷。 macOS 1…...
vue制作防止用户未登录或未填写信息就跳转页面的路由拦截器
在Vue中,你可以使用路由导航守卫来实现防止未登录用户跳转页面的路由拦截器。 首先,你需要创建一个全局前置守卫,用于检查用户是否已登录。在router/index.js文件中,添加如下代码: import router from /router;route…...
postgis ST_CoverageInvalidEdges用法
官方文档 概要 geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance 0); 描述 一个窗口函数,用于检查窗口分区中的多边形是否形成有效的多边形覆盖范围。 它返回线性指示器,显示每个多边形中无效边(如果有&#x…...
sqlalchemy的部分函数合集
func.concat func.group_concat func.find_in_set func.sum func.left func.month func.round func.avg func.rpad func.ifnull func.replace func.date_format CONCAT 函数:将两个或多个字符串连接在一起。例如: SELECT CONCAT(Hello, , World) AS r…...
mac苹果电脑使用日常
让鼠标和触摸板滚动方向一致:使用 Scroll Reverser 软件。 参考:Mac上鼠标滚轮方向是和Win相反的,系统中设置后触摸板的方向又跟着变了 操作: 截屏:shift command 3 复制粘贴:cmdc cmdv 剪切粘贴&#x…...
多线程面试相关知识点
文章目录 (一) 进程线程和协程的区别创建线程的4种方式1. 继承Thread类2. 实现runnable接口3. 实现Callable接口4. 线程池创建 runnable 和 callable 有什么区别线程的 run()和 start()有什么区别?线程之间的状态变化notify()和 notifyAll()有什么区别?j…...
关于生成式人工智能模型应用的调研
本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:A survey of Generative AI Applications 链接:https://arxiv.org/abs/2306.02781 摘要 生成式人工智能(Generative AI)近年来经历了显著的增长&…...
【问题】在安装torchvision的时候,会自动安装torch?
1 背景👇🏻👇🏻👇🏻 在使用如下命令安装torchvision的时候,发现之前已安装的torch被卸载了。 pip install torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple 2 分析🐰&a…...
MySQL数据库备份实战
一、为什么进行数据库备份? 保证业务连续性:数据库中存储着企业的核心业务数据,如果数据丢失或损坏,将会对企业的业务运营产生重大影响。通过定期备份数据库,可以在系统故障或数据丢失时快速恢复数据,保证业务的连续性。 保护数据资产:数据库中存储着企业的重要数据资产…...
每日一题 2558. 从数量最多的堆取走礼物(简单,heapq)
怎么这么多天都是简单题,不多说了 class Solution:def pickGifts(self, gifts: List[int], k: int) -> int:gifts [-gift for gift in gifts]heapify(gifts)for i in range(k):heappush(gifts, -int(sqrt(-heappop(gifts))))return -sum(gifts)...
JavaScript中的Promise
JavaScript中的Promise是一种异步编程的解决方案,它可以避免回调地狱,使代码更加简洁和易于维护。本文将详细介绍Promise的API及其使用案例,并附有代码注释。 Promise的API Promise构造函数 Promise构造函数用于创建一个Promise实例&#…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
IP选择注意事项
IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...
虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)
当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…...
