AppiumWinAppDriver自动化测试 Failed to locate opened application window with appid问题

news/2024/12/16 3:07:08/

问题产生原因:1.期望能力选项参数丢失

例如:capabilities.setCapability("appWorkingDir", "C:\\Program Files (x86)\\Tencent\\app"))

 某些app需要设置目录属性才可以启动。

问题产生原因:2.访问权限不足

例如:开发工具 或者 WinAppDriver 没有权限访问目标app内存。

需要以管理员命令运行。

问题产生原因:3.App启动延迟

例如:App启动,界面为加载成功,代码逻辑已经运行,此刻查找窗口的方法查找不到窗口id。

加入延迟启动属性:capabilities.setCapability("ms:waitForAppLaunch", "5");等待5秒

问题产生原因:4.App进程保护

例如:目标App结果特殊处理,隐藏了窗口指针,以防止恶意程序读取登录等消息。

早期的盗QQ号程序就是通过检测登录窗口来实现HOOK钩子操作,达到盗号目的。

解决方式需要分析内存以获取窗口指针。

其他解释:

这个错误消息表明,您尝试访问的应用程序没有打开,或者您尝试访问的应用程序没有正确注册 appid。

您需要检查您的代码是否正确打开了应用程序,并且应用程序是否正确注册了 appid。

如果应用程序已经打开,则可能是您尝试访问的应用程序的 appid 与实际注册的 appid 不匹配,因此无法找到该应用程序的窗口。

如果应用程序没有打开,则可能是您的代码没有正确调用应用程序的打开方法,或者可能是应用程序存在某些问题,导致无法正常启动。

请检查您的代码,并根据上述情况进行调试。

排除以上3种简单可能、第四种主动内存查找方式访问app (前提:该app没有刻意做安全加固、仅仅隐藏或动态设置了窗口指针)

传送门拿来主义:java取窗口句柄_如何获取Java中的所有窗口句柄列表(使用JNA)?_涛说精彩历史的博客-CSDN博客

package test.driver;import java.io.UnsupportedEncodingException;import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.win32.StdCallLibrary;public class WindowsVistByJNA {public interface User32 extends StdCallLibrary {User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg);int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);}public static void main(String[] args) {final User32 user32 = User32.INSTANCE;user32.EnumWindows(new WNDENUMPROC() {			int count = 0;@Override	public boolean callback(HWND hWnd, Pointer arg1) {byte[] windowText = new byte[512];user32.GetWindowTextA(hWnd, windowText, 512);String wText = Native.toString(windowText);// get rid of this if block if you want all windows regardless of whether			// or not they have textif (wText.isEmpty() || wText.contains("Default IME") || wText.contains("MSCTFIME UI") || wText.contains("Mode Indicator") || wText.contains("Window") ) {			return true;			}		try {System.out.println("Found window with text " + hWnd + ", total " + (++count)	+ " Text: " + new String(wText.getBytes("utf-8")));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}	return true;}}, null);}}

 

将 app 属性替换成 appTopLevelWindow 访问方式,从上述JNA方法获取的HWND Windows窗口句柄以HEX 16进制传入:

 //capabilities.setCapability("app", appPath);capabilities.setCapability("appTopLevelWindow", "0x1309f6");

编程自行整合。

参考链接:

https://github.com/Microsoft/WinAppDriver/issues/641

failed to locate opened application window with appid-掘金

java取窗口句柄_如何获取Java中的所有窗口句柄列表(使用JNA)?_涛说精彩历史的博客-CSDN博客


http://www.ppmy.cn/news/71477.html

相关文章

STM32-ADC过采样实验

我们之前已经有过一些关于STM32-ADC的笔记和实验代码了,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 STM32-单通道ADC采集(DMA读取)实验_Mr_rustylake的博客-…

RLC串联电路的一些形象化的结算

考虑普通的串联电路 考虑仅包含电阻和电感的一段恒流源驱动的电路,电阻和电感串联。 假定此时感抗值 电阻值。此时最终的阻抗值与电阻值和电抗值构成等腰直角三角型。最终的阻抗值 1.414*R. 电路两端的端电压会相对电流超前45度角。 OK,这很容易…

drawio@绘制带有latex公式的图表@示意图@流程图@白板模式whiteboard

文章目录 drawio绘制带有latex公式的图表示意图流程图白板模式whiteboard使用drawio小结 公式编辑Use mathematical typesetting in diagramsUse mathematical typesetting in diagramsTroubleshooting关于文本框元素公式渲染问题🎈Maths is not rendered 模式切换d…

IIC通信理解

前言 就个人对IIC通信的理解,通过用图文的方式,尽量简洁的记录下此文。希望能对大家理解IIC通信协议有所帮助。 理解IIC 对于IIC协议的理解,我个人是将完整的IIC时序协议,分成六大块理解。分别是开始条件,结束条件,发送字节,发送字…

关于modbus通讯协议

什么是modbus通讯协议? Modbus是一种通用的串行通信协议,最初由Modicon公司开发,用于PLC(可编程逻辑控制器)和其他工业设备之间的通信。现在已成为工业通信领域的标准,广泛应用于可编程控制器、传感器、仪…

打印菱形(两种思路)

一、输入的行数等于上半部分的金字塔行数 思路: 仔细观察图形,可以发现,此图形中是由空格和*按照不同个数的输出组成的。 上三角:先输出空格,后输出*,每行中空格:从上往下,一行减少一…

掌握ZBrush的19个建模技巧,让你的雕刻作品更逼真

ZBrush 是一个数字雕刻和绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业,按照世界领先的特效工作室和全世界范围内的游戏设计者的需要,以一种精密的结合方式开发成功的,它提供了极其优秀的功能和特色&#xff0c…

git提交代码到GitLab步骤及拉取远程分支内容

一、本地建立一个空文件夹 点击鼠标右键点击红色箭头方向 Git Hash Here 二、git init 进行初始化 这个时候文件夹中会出现 .git 文件夹 三、添加远程仓库地址 git remote add origin (address) # 添加远程仓库地址 address是远程仓库代码链接 四、如果有分支把远程分支拉到…