gaozhao1989 / pyjab

Python implementation for Java application UI automation with Java Access Bridge
GNU General Public License v2.0
49 stars 20 forks source link

测试用例跑久了,被控制的窗体会卡慢。 #43

Closed xinchenll closed 2 years ago

xinchenll commented 2 years ago

aaaa
最近我用10个测试用例作为一组,不断循环跑。 大慨在跑了30分钟左右,发现被控制的窗体会变慢,比如说正常情况定位某个元素需要1秒钟,随着跑的时间越长,这个定位时间也会慢慢变长,大慨跑了不到1小时就跑不动了,虽然自动测试代码还在跑,但被控制的窗体已经被卡死,手动关都关不了,只能在任务管理器中杀掉,观察CPU和内存都正常,没有明显升高。 也让开发的人看过了,他们现在也没有什么好的解决方案,不知道有人是否碰到过这种情况,该如何解决呢?

gaozhao1989 commented 2 years ago

Hi @xinchenll 目前不能得知您的测试用例及执行场景的任何信息。 根据您的描述,个人推测可能是执行中的某个环节出现了类似执行资源没有被释放的问题。 因此个人主观的设计了一组简易的执行场景连续不间断运行,运行时长为2小时。 通过观察发现,被测试程序和执行端均没有出现明显的执行效率下降或者类似卡死的情况,我本地不能复现您描述的场景。 需要您提供更多的信息以尝试复现该问题,谢谢。

xinchenll commented 2 years ago

Hi @gaozhao1989 非常感谢您的回复, 我想你的思路是对的,因为我在每个测试用例结束后会关闭子窗体,我目前用的是下面这个方式: win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) 今天我特地花时间找了这方面的资料,发现这种关闭方式并不会释放资源,网上大多数建议是加多一行代码: win32gui.DestroyWindow(hwnd) 这样才能真正把资源释放出来,然后这种方法必需是在打开这个窗体里的进程里才能调用。

因为我的执行端有些子窗体在关闭前还会弹出个子窗体进行确认,这导致我在测试用例结束后清理子窗体非常的头疼,因为不是直接点击那个关闭按钮就能关闭的,还有你还得考虑如果测试用例失败时,会有不确定的窗体不在你的计划的代码里出现,不知你有什么更好的通用的关闭子窗体的方法?

gaozhao1989 commented 2 years ago

关于关闭被测试窗体您可以使用以下两种方式

  1. 使用 pyjab 最新集成的上下文管理器参与代码执行,执行完成后将自动关闭pyjab以及被测试窗体。 Thanks contribution from Jason.
  2. 通过属性 hwnd 和 win32 api 关闭被测试窗体
xinchenll commented 2 years ago

HI @gaozhao1989 非常感谢您的回复 上面你说的

  1. 我没看到在哪有具体的文档介绍,不是很明白。
  2. 你说的win32 api 关闭被测试窗体的方法,具体能写个例子出来吗? 因为我上面说的用 win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) 也是win32api 的方法, 今天我又试另外一个方法: win32gui.CloseWindow(hwnd) 也是不行,资源根本没释放出来。 就不知是否还有更好的方法呢?
xinchenll commented 2 years ago

问题找到了,是应用上开发的问题,与pyjab无关,封贴。