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

本文分析了AppiumWinAppDriver在自动化测试中遇到'Failed to locate opened application window with appid'错误的四个主要原因:期望能力选项参数丢失、访问权限不足、App启动延迟和App进程保护。提供了相应的解决方案,包括设置appWorkingDir、以管理员权限运行、增加等待时间以及分析内存获取窗口指针。并提到了利用JNA获取窗口句柄以解决问题。

问题产生原因: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没有刻意做安全加固、仅仅隐藏或动态设置了窗口指针)

传送门拿来主义:

解决无法定位应用程序窗口(appId 为 calc.exe,processId 为 3768)的问题,可以尝试以下几种方法: ### 检查进程是否存在 首先需要确认指定的进程(calc.exe,processId 为 3768)是否确实在运行。可以使用 Windows API 来检查进程是否存在。以下是一个示例代码: ```cpp #include <windows.h> #include <tlhelp32.h> #include <iostream> bool IsProcessRunning(DWORD processId) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return false; } PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32)) { do { if (pe32.th32ProcessID == processId) { CloseHandle(hSnapshot); return true; } } while (Process32Next(hSnapshot, &pe32)); } CloseHandle(hSnapshot); return false; } int main() { DWORD processId = 3768; if (IsProcessRunning(processId)) { std::cout << "Process is running." << std::endl; } else { std::cout << "Process is not running." << std::endl; } return 0; } ``` ### 使用 FindWindow 或 FindWindowEx 函数 如果进程确实在运行,可以使用 `FindWindow` 或 `FindWindowEx` 函数来查找窗口。以下是一个示例代码: ```cpp #include <windows.h> #include <iostream> int main() { const char* appName = "calc.exe"; DWORD processId = 3768; // 尝试通过窗口类名或窗口名查找窗口 HWND hwnd = FindWindow(NULL, appName); if (hwnd == NULL) { std::cout << "Failed to find the window." << std::endl; } else { std::cout << "Window found." << std::endl; } return 0; } ``` ### 检查窗口是否被隐藏或最小化 有时候窗口可能被隐藏或最小化,导致无法正常定位。可以尝试使用 `ShowWindow` 函数将窗口显示出来: ```cpp #include <windows.h> #include <iostream> int main() { const char* appName = "calc.exe"; DWORD processId = 3768; HWND hwnd = FindWindow(NULL, appName); if (hwnd != NULL) { // 显示窗口 ShowWindow(hwnd, SW_SHOWNORMAL); std::cout << "Window shown." << std::endl; } else { std::cout << "Failed to find the window." << std::endl; } return 0; } ``` ### 检查权限问题 确保当前程序具有足够的权限来访问目标进程和窗口。如果程序需要以管理员权限运行,可以尝试以管理员身份启动程序。 ### 检查窗口是否被遮挡 有时候窗口可能被其他窗口遮挡,导致无法正常显示。可以尝试将窗口置于最顶层: ```cpp #include <windows.h> #include <iostream> int main() { const char* appName = "calc.exe"; DWORD processId = 3768; HWND hwnd = FindWindow(NULL, appName); if (hwnd != NULL) { // 将窗口置于最顶层 SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); std::cout << "Window set to topmost." << std::endl; } else { std::cout << "Failed to find the window." << std::endl; } return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值