如何在WinAppDriver(Appium)运行时捕获UWP应用的用户按钮点击事件
报错根因
addEventListener是浏览器DOM元素的专属方法,WinAppDriver返回的UWP控件元素是WebElement实例,本身不提供该方法,因此触发TypeError。- 你使用了同步死循环
while(true)反复调用元素方法,同时所有驱动异步操作没有加await,导致WinAppDriver服务连接被占满、请求堆积,最终触发连接重置ECONNRESET报错。
解决方案
首先移除错误的事件绑定逻辑和同步死循环,采用下列两种方案实现需求:
方案1:轮询检测(适配现有WinAppDriver技术栈)
通过定时轮询检测按钮的UIA属性判断是否被点击,避免阻塞事件循环,代码示例如下:
import { driver, By2, windowsAppDriverCapabilities } from 'selenium-appium' const capabilites = windowsAppDriverCapabilities('<替换为你的UWP应用ID>'); // 所有driver方法都是异步,必须加await await driver.startWithCapabilities(capabilites, 'http://localhost:4723/wd/hub'); // 执行预置测试步骤 // ... 你的原有测试逻辑 const someButton = await driver.findElement(By2.nativeXpath('//替换为你的按钮实际XPath定位')); let customLogicExecuted = false; // 200ms轮询一次,可根据实时性要求调整间隔 const monitor = setInterval(async () => { try { // 通过UIA的IsInvoked属性判断按钮是否被点击,也可替换为按钮文本、可用状态等点击后的特征判断 const isInvoked = await someButton.getAttribute('IsInvoked') === 'True'; if (isInvoked && !customLogicExecuted) { // 执行你的自定义逻辑 // <somelogic> customLogicExecuted = true; // 若仅需触发一次则关闭监测,需要持续监测可删除该行 clearInterval(monitor); } } catch (e) { // 元素丢失、应用关闭时自动终止监测 clearInterval(monitor); } }, 200);
方案2:原生UIA事件监听(实时性更高)
如果需要更低延迟的事件捕获,可以引入Windows UIA封装库,直接监听目标控件的InvokeEvent点击事件,和WinAppDriver运行互不冲突,无需轮询。
额外注意事项
- 所有
driver、WebElement的方法都是异步接口,必须搭配await使用,否则会出现请求时序混乱、连接异常问题 - 确保WinAppDriver服务已正常启动,4723端口未被其他进程占用
- 不要使用同步死循环阻塞Node.js事件循环,会直接导致驱动连接崩溃
内容的提问来源于stack exchange,提问作者Виталик Сотников
相关产品推荐
相关产品推荐

