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

为什么我无法定位子窗体里的控件 #19

Closed xinchenll closed 2 years ago

xinchenll commented 2 years ago

昨天定位主窗体没问题,今天试下弹出窗口的定位,发现定位不了,如图: 20211125165521

于是我用最简单的方法进行测试,如下

driver = JABDriver("XXXXXXXXXXXXXX") list=driver.find_elements_by_role("root pane") print(list)

然后它只返回主窗体那个root pane 按上图显示,应该会有两个root pane才对,不知是哪出问题了,请大佬解答下,谢谢!

xinchenll commented 2 years ago

问题貌似解决了,在弹出新的窗口后继续实例化一个drive1,在新在drive1的确是能定位到控件。 driver1 = JABDriver("预订清单") element=driver1.find_element_by_xpath("//label[@name='付款方式' and @Object Depth=9]") print(element)

上面语句能成功执行,是不是我在selenium上惯性思维了,selenium至始至终都是一个driver, 是不是在jab里,只要你弹出一个新的窗体出来,必需要实例化一个新的driver呢? 那么请问当我用完这个弹出窗后,一般你是用什么方法来关闭和释放driver呢??

gaozhao1989 commented 2 years ago

Hi @xinchenll

我有注意到您提出的问题,这与一开始 pyjab 的设计模式有关。 与 selenium 不同的是,pyjab 没有所谓的对应浏览器 driver 文件,无法绑定“所需”的 Java 应用程序,相对 hwnd 和 vmid 而言,窗口标题是较为友好的“绑定”方式。 但需要说明的是,如果是使用的同一个 Java 应用程序,大多数情况下程序的 vmid 是相同的。

未来可能考虑会引入类似 selenium driver.switch_to 的方式进行切换,但目前来讲,现有的实现方式通过实例化多个 JABDriver 类来解决窗口切换的问题不失为一种解决方式。

针对您提出的释放问题,由于并不存在真正意义上的实例绑定,建议直接使用 del 语句或者不用清理

driver = JABDriver(title="xxxx")
del driver