Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

大佬春节好,我感觉复杂点的窗体定位控件很慢! #33

Open
xinchenll opened this issue Feb 4, 2022 · 13 comments
Open
Labels
bug Something isn't working

Comments

@xinchenll
Copy link

这几天利用假期我又来学习pyjab,发现在控件多的窗体内定位控件比较慢,特别是有table的窗体,而且table里的内容还比较多,定位得特别慢,刚才定位一个控件需要40秒钟,这貌似也太久了,后来我把xpath改成下面的全路径模式:

driver.find_element_by_xpath(
"//root pane/layered pane/panel[@indexinparent=0]/panel[@indexinparent=0]/panel[@indexinparent=1]/panel[@indexinparent=1]/push button[@indexinparent=6]"

以为这样把所有路径都指定好,会快一些,谁知道并没有任何改善,还是需要约40秒才能成功定位,期间我观察这段时间的cpu利用率真,会上升一些,但是cpu还是很空闲,于是我想用多线程的方法提高CPU利用率,大慨是下面的方法:

from multiprocessing import Process

p = Process(target=, args=("bt",))
ps_list = []
for i in range(0, cpu_logical_count):
ps_list.append(Process(target=driver.find_element_by_xpath, args=(xpath,))
for p in ps_list:
p.start()
for p in ps_list:
p.join()

发现这样不行,会报错,现在也没什么好的办法了,不知道你那有什么好的建议没有?

@gaozhao1989
Copy link
Owner

gaozhao1989 commented Feb 6, 2022

Hi @xinchenll

新年快乐!感谢关注!

让我拆分一下问题:
Q1: 控件较多的窗体内定位控件比较慢
A1: 这是设计伊始就存在的问题,原因在于所有的查找控件的方式都是从根控件开始进行递归遍历( JAB 官方的 API 并没有提供可以快捷查找到控件的方式,所以... 详细实现可参考 pyjab 内置函数 _generate_all_childs )。再加上对 Xpath 本身的解析时间,那么耗时会更久一些。就目前来说,以个人能力水平,需要对其进行优化有一定的难度,我也十分期待能有其他热心的开发者能提出一些更好的思路。

Q2: 这段时间的cpu利用率真,会上升一些,但是cpu还是很空闲
A2: 很遗憾的是,pyjab 目前不会考虑并使用多线程的方式提升执行效率,目前没有尝试可否使用 JAB API 能否进行多线程调用。有趣的是,您提到的 CPU 占用率问题刚好与 #29 有重叠之处,不同的是,该问题反馈的是 CPU 占用率过高的问题。

Q3: 我想用多线程的方法提高CPU利用率,发现这样不行,会报错
A3: 在 A2 中有提到描述目前 pyjab 并没有使用多线程,另 pyjab 设计的定位控件方式目前也不支持多线程进行操作。

@gaozhao1989 gaozhao1989 added the bug Something isn't working label Feb 6, 2022
@suqi95716aa
Copy link

你好大佬,有个方式通过xpath查找元素driver.find_element_by_xpath(),但是在仔细观察开放文档和API发现并没有获取xpath的方式,不知道是没有还是我的使用方式有问题呢

@gaozhao1989
Copy link
Owner

@suqi95716aa 你好,

xpath 的查找形式并不存在于JAB API 中,属于 pyjab 自定义的查找方式,用于定位较为复杂的控件
关于 xpath 的使用可以参考

find_element_by_xpath("//internal frame/panel")
find_element_by_xpath("//*/panel")
find_element_by_xpath("//internal frame[@name='FRM-999']")
find_element_by_xpath("//internal frame[@name=contains('FRM-999')]")
find_element_by_xpath("//internal frame[@states='enable,focusable,visible,showing']")
find_element_by_xpath("//internal frame[@states=contains('enable,focusable')]")
find_element_by_xpath("//internal frame[@objectdepth=7]")
find_element_by_xpath("//internal frame[@childrencount=2]")
find_element_by_xpath("//internal frame[@indexinparent=3]")
find_element_by_xpath("//internal frame[@name=contains('FRM-999') and @objectdepth=7]")

@gaozhao1989
Copy link
Owner

gaozhao1989 commented May 23, 2022

@xinchenll 你好,

推荐您使用这样的方式进行定位查找控件,可能会快一些
一次或多次的指定被查找控件的父级控件,然后再根据父级控件查找子控件

@suqi95716aa
Copy link

@suqi95716aa 你好,

xpath 的查找形式并不存在于JAB API 中,属于 pyjab 自定义的查找方式,用于定位较为复杂的控件 关于 xpath 的使用可以参考

find_element_by_xpath("//internal frame/panel")
find_element_by_xpath("//*/panel")
find_element_by_xpath("//internal frame[@name='FRM-999']")
find_element_by_xpath("//internal frame[@name=contains('FRM-999')]")
find_element_by_xpath("//internal frame[@states='enable,focusable,visible,showing']")
find_element_by_xpath("//internal frame[@states=contains('enable,focusable')]")
find_element_by_xpath("//internal frame[@objectdepth=7]")
find_element_by_xpath("//internal frame[@childrencount=2]")
find_element_by_xpath("//internal frame[@indexinparent=3]")
find_element_by_xpath("//internal frame[@name=contains('FRM-999') and @objectdepth=7]")

是的,我看到了这样根据xpath找到元素的方式,但是我这边有一个需求,比如通过坐标位置获取这个坐标位置下的元素控件,并获取一些关于这个控件的属性。比如parent、xpath、classname、name等信息,不知道有没有相关的API呢

@gaozhao1989
Copy link
Owner

@suqi95716aa
可以参考 JAB 原生 api
是有通过坐标获取的方式

@suqi95716aa
Copy link

@gaozhao1989
好的谢谢

@discovery-131794
Copy link

discovery-131794 commented May 30, 2022

pyjab.zip
@suqi95716aa 我根据自己的需要扩展了一下pyjab,添加了两个方法,find_element_by_levels和find_element_by_search_properties,主要是根据深度跳过一些没必要查找的元素,提高查找效率。

    from pyjab import JDriver, JDriverWait
    jdriver = JDriver('Oracle Applications - EBS AMER Certification R12.2 SBC619 clone *', timeout=60) # java window
    wait = JDriverWait(jdriver)
    frame = jdriver.find_element_by_levels({
        'name': 'Sales Orders - [New]',
        'role': 'internal frame',
        'depth': 10
        })
    wait.until(lambda _ : frame.is_visible())
    jdriver.find_element_by_levels((
        {'role': 'panel','depth': 6,'found_index': 2},
        {'role': 'tool bar', 'depth': 1},
        {'role': 'push button', 'found_index': 2}
        )).click()

@gaozhao1989
Copy link
Owner

Hi @discovery-131794,

Thanks for your contribution, very nice idea for get specific level child Element from node tree.
It have similar usage like objectdepth of xpath in pyjab

jabdriver.find_element_by_xpath("//internal frame[@name='FRM-999']/push button[@states='A,B,C' and @objectdepth=7 and @childrencount=2 @indexinparent=3]")

@gaozhao1989
Copy link
Owner

Reopen the issue

@gaozhao1989 gaozhao1989 reopened this May 30, 2022
@suqi95716aa
Copy link

@discovery-131794 Thanks for ur giving. I will try to integrate ur change into my project and do some other change, at that time, I will contribute my code here.

@szczepanR
Copy link

Hi @discovery-131794 ,
Does your solution decrease CPU consumption?

@discovery-131794
Copy link

Hi @discovery-131794 , Does your solution decrease CPU consumption?

Hi @szczepanR ,
My Solution just compares element attributes with properties you provide. So if you skip more elements, it will work more efficiently.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

5 participants