界面元素的定位方法、电子设备及存储介质转让专利

申请号 : CN202210386808.2

文献号 : CN114816401B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 潘巍王铁汪勇旭何叶景雪松

申请人 : 上海弘玑信息技术有限公司

摘要 :

本申请提供一种界面元素的定位方法、电子设备及存储介质,该方法由电子设备执行,电子设备安装有机器人软件和使用Cef技术的软件客户端,该方法包括:机器人软件启动软件客户端,并将第一代码动态链接库注入软件客户端的进程中;第一代码动态链接库拦截软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库;第二代码动态链接库加载软件客户端的界面元素;第一代码动态链接库拦截第二代码动态链接库发送给软件客户端的加载完成通知,并调用第二代码动态链接库的编程接口,执行界面元素定位脚本。该方案让不支持accessibility技术的Cef软件客户端,能准确定位界面元素。

权利要求 :

1.一种界面元素的定位方法,其特征在于,所述方法由电子设备执行,所述电子设备安装有机器人软件和使用Cef技术的软件客户端,所述方法包括:所述机器人软件启动所述软件客户端,并将第一代码动态链接库注入所述软件客户端的进程中;

所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库,包括:通过函数挂钩技术,在所述软件客户端调用所述第二代码动态链接库的对象创建函数之前,跳转到所述第一代码动态链接库的参数修改函数;所述参数修改函数修改所述软件客户端传入的地址获取函数为所述第一代码动态链接库的返回函数,并将所述返回函数传入所述第二代码动态链接库;调用所述第二代码动态链接库的对象创建函数,创建浏览器对象;或者,所述软件客户端调用所述第一代码动态链接库的导出函数,跳转到所述第二代码动态链接库的对应函数;在调用所述第一代码动态链接库的对象创建函数时,修改所述软件客户端传入的地址获取函数为所述第一代码动态链接库的返回函数,并将所述返回函数传入所述第二代码动态链接库;调用所述第二代码动态链接库的对象创建函数,创建浏览器对象;

所述第二代码动态链接库加载所述软件客户端的界面元素;

所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本。

2.根据权利要求1所述的方法,其特征在于,所述执行界面元素定位脚本,包括:所述软件客户端通过socket网络通信技术与所述机器人软件进行通信,接收机器人软件发送的鼠标位置信息;

所述软件客户端向所述机器人软件返回所述鼠标位置信息对应的界面元素信息。

3.根据权利要求2所述的方法,其特征在于,所述执行界面元素定位脚本,包括:所述软件客户端接收所述机器人软件发送的界面元素信息和操作信息;

根据所述界面元素信息,找到相应的界面元素;

根据所述操作信息,对找到的所述界面元素执行相应的操作。

4.根据权利要求1所述的方法,其特征在于,所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库,包括:所述第一代码动态链接库拦截所述软件客户端发送给所述第二代码动态链接库的界面元素加载通知;

所述第一代码动态链接库对所述界面元素加载通知进行修改;

所述第一代码动态链接库将修改后的界面元素加载通知转发到第二代码动态链接库。

5.根据权利要求1所述的方法,其特征在于,所述第二代码动态链接库加载所述软件客户端的界面元素,包括:通过所述浏览器对象绘制所述软件客户端的界面元素。

6.根据权利要求1所述的方法,其特征在于,所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本,包括:所述第二代码动态链接库调用所述第一代码动态链接库的返回函数,获得所述第一代码动态链接库的执行函数;

所述第二代码动态链接库调用所述执行函数;

所述执行函数调用所述软件客户端的通知函数,通知所述软件客户端界面加载完成;

所述执行函数调用所述第二代码动态链接库的指定函数执行所述界面元素定位脚本。

7.一种电子设备,其特征在于,所述电子设备包括:

处理器;

用于存储处理器可执行指令的存储器;

其中,所述处理器被配置为执行权利要求1‑6任意一项所述的界面元素的定位方法。

8.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机程序,所述计算机程序可由处理器执行以完成权利要求1‑6任意一项所述的界面元素的定位方法。

说明书 :

界面元素的定位方法、电子设备及存储介质

技术领域

[0001] 本申请涉及机器人流程自动化技术领域,特别涉及一种界面元素的定位方法、电子设备及存储介质。

背景技术

[0002] 界面元素是指软件客户端上与用户交互的各种元素,如按钮,输入框,选择框,表格等。软件客户端是指操作系统中的一般软件,如即时通信软件APP,音乐播放器等。
[0003] windows accessibility是微软windows操作系统提供的编程接口,可以定位大部分的软件客户端界面元素。使用IAccessible技术的一般方法:
[0004] (1)调用windows api AccessibleObjectFromWindow通过软件客户端的主窗口返回一个IAccessible的对象指针,这个对象代表目标软件的主窗口控件;(2)调用IAccessible::get_accChild遍历IAccessible对象的所有子控件(即界面元素)对象;(3)调用IAccessible::get_accValue获得控件的文本信息;(4)调用IAccessible::accLocation获得控件的位置信息;(5)使用IAccessible的其他接口获取其他相关的信息。
[0005] 使用windows accessibility技术的限制是:如果被定位的软件客户端的界面元素是使用标准windows控件技术创建的,只能使用windows提供的按钮,输入框等控件,此时目标软件自动支持accessibility技术。
[0006] 如果软件客户端的界面元素都是使用GDI等绘图技术绘制的,则软件客户端内部必须提供对accessibility技术的支持,需要响应窗口消息WM_GETOBJECT,返回合适的IAccessibled对象,如果软件客户端未提供这种支持,则不能使用accessibility技术来定位此软件的界面元素。
[0007] Cef框架是基于谷歌的chromium开源库,chromium的核心是浏览器技术,因此使用Cef框架制作的软件客户端的界面元素本质上是网页元素,都是通过绘制技术画上去的,因此chromium需要自己实现对accessibility技术的支持。
[0008] 使用Cef框架制作的软件客户端所展示的界面实际上是网页,网页可以设计的非常复杂,界面元素可以成千上万,而chromium内部对accessibility技术的支持不太完善,因此会发生定位不到某些元素,或者定位某些元素位置不准确的问题。

发明内容

[0009] 本申请实施例提供了一种界面元素的定位方法,用以对不支持accessibility技术的cef软件客户端也能实现界面元素定位。
[0010] 本申请实施例了一种界面元素的定位方法,所述方法包括:
[0011] 所述方法由电子设备执行,所述电子设备安装有机器人软件和使用Cef技术的软件客户端,所述方法包括:
[0012] 所述机器人软件启动所述软件客户端,并将第一代码动态链接库注入所述软件客户端的进程中;
[0013] 所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库;
[0014] 所述第二代码动态链接库加载所述软件客户端的界面元素;
[0015] 所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本。
[0016] 在一实施例中,所述执行界面元素定位脚本,包括:
[0017] 所述软件客户端通过socket网络通信技术与所述机器人软件进行通信,接收机器人软件发送的鼠标位置信息;
[0018] 所述软件客户端向所述机器人软件返回所述鼠标位置信息对应的界面元素信息。
[0019] 在一实施例中,所述执行界面元素定位脚本,包括:
[0020] 所述软件客户端接收所述机器人软件发送的界面元素信息和操作信息;
[0021] 根据所述界面元素信息,找到相应的界面元素;
[0022] 根据所述操作信息,对找到的所述界面元素执行相应的操作。
[0023] 在一实施例中,所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库,包括:
[0024] 所述第一代码动态链接库拦截所述软件客户端发送给所述第二代码动态链接库的界面元素加载通知;
[0025] 所述第一代码动态链接库对所述界面元素加载通知进行修改;
[0026] 所述第一代码动态链接库将修改后的界面元素加载通知转发到第二代码动态链接库。
[0027] 在一实施例中,所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库,包括:
[0028] 通过函数挂钩技术,在所述软件客户端调用所述第二代码动态链接库的对象创建函数之前,跳转到所述第一代码动态链接库的参数修改函数;
[0029] 所述参数修改函数修改所述软件客户端传入的地址获取函数为所述第一代码动态链接库的返回函数,并将所述返回函数传入所述第二代码动态链接库;
[0030] 调用所述第二代码动态链接库的对象创建函数,创建浏览器对象。
[0031] 在一实施例中,所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库,包括:
[0032] 所述软件客户端调用所述第一代码动态链接库的导出函数,跳转到所述第二代码动态链接库的对应函数;
[0033] 在调用所述第一代码动态链接库的对象创建函数时,修改所述软件客户端传入的地址获取函数为所述第一代码动态链接库的返回函数,并将所述返回函数传入所述第二代码动态链接库;
[0034] 调用所述第二代码动态链接库的对象创建函数,创建浏览器对象。
[0035] 在一实施例中,所述第二代码动态链接库加载所述软件客户端的界面元素,包括:
[0036] 通过所述浏览器对象绘制所述软件客户端的界面元素。
[0037] 在一实施例中,所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本,包括:
[0038] 所述第二代码动态链接库调用所述第一代码动态链接库的返回函数,获得所述第一代码动态链接库的执行函数;
[0039] 所述第二代码动态链接库调用所述执行函数;
[0040] 所述执行函数调用所述软件客户端的通知函数,通知所述软件客户端界面加载完成;
[0041] 所述执行函数调用所述第二代码动态链接库的指定函数执行所述界面元素定位脚本。
[0042] 本申请实施例提供了一种界面元素的定位装置,包括:
[0043] 代码注入模块,用于通过机器人软件启动软件客户端,将第一代码动态链接库注入所述软件客户端的进程中;
[0044] 加载通知模块,用于通过所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库;
[0045] 元素加载模块,用于通过所述第二代码动态链接库加载所述软件客户端的界面元素;
[0046] 脚本执行模块,用于通过所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本。
[0047] 本申请实施例提供了一种电子设备,所述电子设备包括:
[0048] 处理器;
[0049] 用于存储处理器可执行指令的存储器;
[0050] 其中,所述处理器被配置为执行上述界面元素的定位方法。
[0051] 本申请实施例提供了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序可由处理器执行以完成上述界面元素的定位方法。
[0052] 本申请上述实施例提供的技术方案,通过将第一代码动态链接库注入软件客户端的进程中,拦截软件客户端发送的界面元素加载通知,修改后转发到软件客户端的第二代码动态链接库,拦截第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用第二代码动态链接库的编程接口,执行界面元素定位脚本,从而软件客户端即使不支持accessibility技术,也能准确定位界面元素。

附图说明

[0053] 为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍。
[0054] 图1是本申请一实施例提供的电子设备的结构示意图;
[0055] 图2是本申请一实施例提供的界面元素的定位方法的流程示意图;
[0056] 图3是本申请一实施例提供的界面元素的定位方法的原理示意图;
[0057] 图4是图2对应实施例中步骤S220的细节流程图;
[0058] 图5是正常的软件客户端进行界面元素加载的流程示意图;
[0059] 图6是本申请一实施例提供的进行界面元素加载的流程示意图;
[0060] 图7是本申请一实施例提供的界面元素定位脚本的流程示意图;
[0061] 图8是本申请另一实施例提供的图2对应实施例中步骤S220的细节流程图;
[0062] 图9是本申请另一实施例提供的进行界面元素加载的流程示意图;
[0063] 图10是本申请一实施例提供的界面元素的定位装置的框图。

具体实施方式

[0064] 下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
[0065] 相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
[0066] 图1是本申请实施例提供的电子设备的结构示意图。该电子设备100可以用于执行本申请实施例提供的界面元素的定位方法。如图1所示,该电子设备100包括:一个或多个处理器102、一个或多个存储处理器可执行指令的存储器104。其中,所述处理器102被配置为执行本申请下述实施例提供的界面元素的定位方法。
[0067] 所述处理器102可以是网关,也可以为智能终端,或者是包含中央处理单元(CPU)、图像处理单元(GPU)或者具有数据处理能力和/或指令执行能力的其它形式的处理单元的设备,可以对所述电子设备100中的其它组件的数据进行处理,还可以控制所述电子设备100中的其它组件以执行期望的功能。
[0068] 所述存储器104可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器102可以运行所述程序指令,以实现下文所述的界面元素的定位方法。在所述计算机可读存储介质中还可以存储各种应用程序和各种数据,例如所述应用程序使用和/或产生的各种数据等。
[0069] 在一实施例中,图1示电子设备100还可以包括输入装置106、输出装置108以及数据采集装置110,这些组件通过总线系统112和/或其它形式的连接机构(未示出)互连。应当注意,图1示的电子设备100的组件和结构只是示例性的,而非限制性的,根据需要,所述电子设备100也可以具有其他组件和结构。
[0070] 所述输入装置106可以是用户用来输入指令的装置,并且可以包括键盘、鼠标、麦克风和触摸屏等中的一个或多个。所述输出装置108可以向外部(例如,用户)输出各种信息(例如,图像或声音),并且可以包括显示器、扬声器等中的一个或多个。所述数据采集装置110可以采集对象的图像,并且将所采集的图像存储在所述存储器104中以供其它组件使用。示例性地,该数据采集装置110可以为摄像头。
[0071] 在一实施例中,用于实现本申请实施例的界面元素的定位方法的示例电子设备100中的各器件可以集成设置,也可以分散设置,诸如将处理器102、存储器104、输入装置
106和输出装置108集成设置于一体,而将数据采集装置110分离设置。
[0072] 在一实施例中,用于实现本申请实施例的界面元素的定位方法的示例电子设备100可以被实现为诸如智能手机、平板电脑、台式电脑、车载设备等智能终端。
[0073] 图2是本申请实施例提供的一种界面元素的定位方法的流程示意图,所述方法由电子设备执行,所述电子设备安装有机器人软件和使用Cef技术的软件客户端,如图2所示,该方法包括:步骤S210‑步骤S240。
[0074] 步骤S210:机器人软件启动所述软件客户端,并将第一代码动态链接库注入所述软件客户端的进程中。
[0075] 软件客户端是指使用Cef技术开发交互界面的软件,例如使用Cef技术的即时通信软件、音乐播放软件等。Cef(Chromium Embedded Framework),是基于google Chrominum开源库开发的一个框架,使用Cef可以让人们用网页的方式展现软件客户端交互界面。
[0076] 需要说明的是,使用Cef框架编写软件的一般步骤是调用Cef提供的API CefBrowserHost::CreateBrowser创建一个CefBrowser对象,然后再用这个CefBrowser去加载远程地址的网页或者本地网页。调用CefBrowserHost::CreateBrowser需要传入一个CefWindowInfo对象作为参数,CefWindowInfo对象用来设置窗口的参数,如果调用API CefWindowInfo::SetAsPopup就是使用有窗体的模式,如果调用API CefWindowInfo::SetAsWindowless就是无窗体模式。
[0077] 有窗体模式是指Cef框架内部会创建窗口,软件客户端的开发者无需提供额外的窗口,开发的软件能够支持windows accessibility技术,因为谷歌已经在内部做了实现,但是可能会有定位界面元素不准确的问题。
[0078] 无窗体模式是指软件客户端开发者需要自己创建窗口,Cef框架内部不会创建窗口,因此无法接受窗口消息,无法支持windows accessibility技术,并且软件客户端开发者和Cef框架本身也没有提供其它定位界面元素的方法,所以也没有技术能够定位界面元素。
[0079] 可见,有窗体模式的Cef软件客户端能够支持windows accessibility技术,但是会存在定位界面元素不准确的问题,而无窗体模式的Cef软件客户端没有技术能够定位界面元素。而本申请实施例提供的方法,可以准确定位Cef软件客户端的界面元素,包括有窗体模式和无窗体模式。
[0080] 机器人软件是用来定位软件客户端的界面元素和执行自动化流程的软件。
[0081] 第一代码动态链接库与下文的第二代码动态链接库进行区分,第一代码动态链接库(mycef.dll)是机器人软件开发者制作的,用于注入到软件客户端的进程中,从而拦截软件客户端与第二代码动态链接库(libcef.dll)的通信,在界面元素加载完成时让软件客户端执行开发者事先准备好的JavaScript脚本(即下文的界面元素定位脚本)。具体的,可以使用DLL(Dynamic Link Library,动态链接库)注入技术,也可以是将软件客户端目录中的代码动态链接库libcef.dll重命名为libcef2.dll(即第二代码动态链接库),然后把开发者自己的编写的代码动态链接库mycef.dll拷贝到该目录下,命名为libcef.dll(即第一动态链接库)。
[0082] libcef.dll是Cef的代码动态链接库,软件客户端开发者通过这个动态链接库提供的编程接口来开发软件客户端界面。
[0083] 步骤S220:所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库。
[0084] 如图3所示,第一代码动态链接库拦截了软件客户端与第二代码动态链接库之间的通信。界面元素加载通知发送到第一代码动态链接库后,第一代码动态链接库对界面元素加载通知进行了修改,之后才转发到第二代码动态链接库。具体的,可以修改软件客户端传入的地址获取函数为第一代码动态链接库的返回函数,从而可以插入自主开发的界面元素定位脚本。
[0085] 在一实施例中,如图4所示,上述步骤S220具体包括:步骤S221‑步骤S223。
[0086] 需要注意的是,由于对步骤S220的说明会涉及到多个函数,因此我们采用代号的方式来描述这些函数,这些代号并不是实际的函数名称,对这些代号说明如下:
[0087] LA:第二代码动态链接库的导出函数,其作用是创建一个浏览器对象,故命名为对象创建函数。
[0088] FA:软件客户端的地址获取函数,其作用是使第二代码动态链接库(libcef.dll)可以获取函数FB的地址。
[0089] FB:软件客户端中的函数,其作用是使第二代码动态链接库(libcef.dll)可以通知软件客户端界面加载完成。
[0090] MA:第一代码动态链接库的参数修改函数,其作用是修改FA。
[0091] MB:第一代码动态链接库的返回函数,其作用是返回MC。
[0092] MC:第一代码动态链接库的执行函数,其作用是调用执行JavaScript代码(界面元素定位脚本)的函数,并调用FB通知软件客户端界面加载完成。
[0093] 步骤S221:通过函数挂钩技术,在所述软件客户端调用所述第二代码动态链接库的对象创建函数之前,跳转到所述第一代码动态链接库的参数修改函数。
[0094] 图5是现有的软件客户端进行界面元素加载的流程示意图。需要说明的是,如图5所示,软件客户端使用Cef技术进程界面展示时,第一步,软件客户端调用第二代码动态链接库(libcef.dll)的导出函数LA创建一个浏览器对象(browser对象),调用函数LA时会传入软件客户端中的函数FA作为参数。第二步,软件客户端调用browser对象加载页面。第三步,第二代码动态链接库调用函数FA获取软件客户端的函数FB。第四步,第二代码动态链接库调用函数FB通知软件客户端界面加载完成。
[0095] 而本申请实施例为了插入自主开发的界面元素定位脚本,开发者可以使用C++制作一个动态链接库,命名为mycef.dll(即第一代码动态链接库),并导出一个可调用的函数,函数名可以叫InitCef,函数的作用:使用函数挂钩技术,拦截libcef.dll(即第二代码动态链接库)中的用于创建浏览器对象的导出函数LA,使其在执行时先跳转到第一代码动态链接库(mycef.dll)中的参数修改函数(代号函数MA)。
[0096] 步骤S222:所述参数修改函数修改所述软件客户端传入的地址获取函数为所述第一代码动态链接库的返回函数,并将所述返回函数传入所述第二代码动态链接库。
[0097] 当软件客户端调用所述第二代码动态链接库的对象创建函数LA时,由于被调用的对象创建函数LA被开发者做了钩子,因此此时对象创建函数LA会跳转到mycef.dll的参数修改函数MA,调用参数修改函数MA,替换软件客户端传入的地址获取函数FA为mycef.dll中的返回函数MB,将MB传入libcef.dll。
[0098] 步骤S223:调用所述第二代码动态链接库的对象创建函数,创建浏览器对象。
[0099] 如图6所示,步骤(1)软件客户端调用对象创建函数LA创建浏览器对象(brower对象),并传入地址获取函数FA;步骤(2)调用对象创建函数LA之前,跳转到执行函数MA(替换FA为MB,调用LA创建brower对象);步骤(3)软件客户端调用brower对象加载页面。
[0100] 步骤S230:所述第二代码动态链接库加载所述软件客户端的界面元素。
[0101] 如图6所示,通过浏览器对象(brower对象)绘制所述软件客户端的界面元素。
[0102] 步骤S240:通过所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本。
[0103] 在界面元素加载完成后,如图6所示,步骤(4)所述第二代码动态链接库调用所述第一代码动态链接库的返回函数MB,获得所述第一代码动态链接库的执行函数MC。步骤(5)所述第二代码动态链接库调用所述执行函数MC,通知界面加载完成。步骤(6)所述执行函数MC调用所述软件客户端的通知函数FB,通知所述软件客户端界面加载完成;步骤(7)所述执行函数MC调用所述第二代码动态链接库的指定函数(也就是编程接口)执行所述界面元素定位脚本(JavaScript代码)。
[0104] 其中,定位界面元素是指获得界面元素的各种信息,如位置,大小,内容等,并可以根据这些信息反过来再定位界面元素。
[0105] 在一实施例中,如图7所示,界面元素定位脚本的具体内容包括:
[0106] 步骤S701:软件客户端通过socket网络通信技术与机器人软件进行通信,接收机器人软件发送的鼠标位置信息。
[0107] Socket是一种网络通信技术,用于同一台电脑的多个程序间通信。当用户在软件客户端上移动,执行界面元素选择操作时,机器人软件会通过socket与软件客户端中被执行的JavaScript代码通信,发送当前的鼠标位置信息,鼠标位置信息可以用鼠标的坐标(x,y)表示。
[0108] 步骤S702:软件客户端向所述机器人软件返回所述鼠标位置信息对应的界面元素信息。
[0109] 软件客户端中被执行的JavaScript代码向机器人软件返回鼠标位置对应的界面元素信息,界面元素信息可以包括元素大小、坐标、标题等信息。例如当用户移动到一个按钮上是,可以返回按钮的坐标、大小、标题等内容。
[0110] 步骤S703:接收所述机器人软件发送的界面元素信息和操作信息。
[0111] 在自动化流程执行时,软件客户端中被执行的JavaScript代码接收所述机器人软件发送的界面元素信息和操作信息,操作信息可以是点击、输入等。界面元素的不同,可以有不同的操作。
[0112] 步骤S704:根据所述界面元素信息,找到相应的界面元素。
[0113] 具体的,软件客户端中被执行的JavaScript代码可以根据界面元素信息包括的坐标,找到该坐标对应的界面元素,例如按钮、输入框等。
[0114] 步骤S705:根据所述操作信息,对找到的所述界面元素执行相应的操作。
[0115] 举例来说,操作信息可以是点击,界面元素可以是一个按钮,在找到该按钮后可以自动对该按钮进行点击操作。
[0116] 本申请上述实施例提供的技术方案,通过将第一代码动态链接库注入软件客户端的进程中,拦截软件客户端发送的界面元素加载通知,修改后转发到页面加载框架的第二代码动态链接库,拦截第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用第二代码动态链接库的编程接口,执行界面元素定位脚本,从而软件客户端即使不支持accessibility技术,也能准确定位界面元素。
[0117] 在另一实施例中,如图8所示,上述步骤S220具体包括:步骤S801‑步骤S803。
[0118] 步骤S801:所述软件客户端调用所述第一代码动态链接库的导出函数,跳转到所述第二代码动态链接库的对应函数。
[0119] libcef.dll是Cef框架中提供代码库,其导出函数有大约200个,用于提供给开发者使用,因此如果想要替换原有的libcef.dll,就必须提供同样的导出函数,然后在这些导出函数中跳转到原来的libcef.dll中。
[0120] 在一实施例中,如图9所示,可以把软件客户端目录中的libcef.dll(即第二代码动态链接库)重命名为libcef2.dll,然后把开发者编写的mycef.dll(即第一代码动态链接库)拷贝过去,实现代码注入,此时mycef.dll可以命名为libcef.dll。从而软件客户端会加载开发者编写的libcef.dll(第一代码动态链接库),而libcef.dll再加载libcef2.dll(即第二代码动态链接库)并且获取其所有的导出函数地址用于跳转。
[0121] 当软件客户端用Cef技术进程界面展示时,会调用各种libcef.dll的导出函数,都直接跳转到libcef2.dll中的对应函数,除了用于创建browser对象的对象创建函数LA。
[0122] 步骤S802:在调用所述第一代码动态链接库的对象创建函数时,修改所述软件客户端传入的地址获取函数为所述第一代码动态链接库的返回函数,并将所述返回函数传入所述第二代码动态链接库。
[0123] 如图9所示,步骤(1)软件客户端调用对象创建函数LA,并传入软件客户端中的地址获取函数FA作为参数。其中,地址获取函数FA的作用是libcef2.dll用来获取目软客户端中通知函数FB的地址,通知函数FB的作用是libcef2.dll用来通知目标软件界面加载完成。
[0124] 如图9所示,步骤(2)libcef.dll(第一代码动态链接库)中的函数LA修改传入的地址获取函数FA,替换地址获取函数FA为Libcef.dll中的返回函数MB,传入libcef2.dll,调用libcef2.dll的函数LA创建浏览器对象。其中,返回函数MB的作用是返回函数libcef.dll中的执行函数MC。执行函数MC的作用是执行JavaScript代码然后调用通知函数FB。
[0125] 步骤S803:调用所述第二代码动态链接库的对象创建函数LA,创建浏览器对象。具体的,步骤(3)可以通过浏览器对象(brower对象)绘制所述软件客户端的界面元素。
[0126] 之后步骤参见上文实施例,软件客户端的界面加载完成时,libcef2.dll尝试调用地址获取函数FA来获取通知函数FB,但由于FA被替换成了返回函数MB,因此步骤(4)所述第二代码动态链接库调用所述第一代码动态链接库的返回函数MB,获得所述第一代码动态链接库的执行函数MC。步骤(5)所述第二代码动态链接库调用所述执行函数MC,通知界面加载完成。步骤(6)所述执行函数MC调用所述软件客户端的通知函数FB,通知所述软件客户端界面加载完成;步骤(7)所述执行函数MC调用libcef2.dll中特定函数执行上面已开发好的JavaScript代码(即界面元素定位脚本),与机器人软件建立socket通信连接。机器人软件通过socket与软件客户端中被执行的JavaScript代码通信,发送鼠标位置消息,被执行的JavaScript代码用鼠标位置定位界面元素,并且返回界面元素信息给机器人软件。机器人软件利用界面元素信息(如屏幕上的位置等),执行鼠标点击等自动化流程。
[0127] 下述为本申请装置实施例,可以用于执行本申请上述界面元素的定位方法实施例。对于本申请装置实施例中未披露的细节,请参照本申请界面元素的定位方法实施例。
[0128] 图10为本申请一实施例示出的界面元素的定位装置的框图。如图10所示,该装置包括:代码注入模块1010、加载通知模块1020、元素加载模块1030以及元素执行模块1040。
[0129] 代码注入模块1010,用于通过机器人软件启动软件客户端,将第一代码动态链接库注入所述软件客户端的进程中;
[0130] 加载通知模块1020,用于通过所述第一代码动态链接库拦截所述软件客户端发送的界面元素加载通知,对所述界面元素加载通知进行修改后转发到所述软件客户端的第二代码动态链接库;
[0131] 元素加载模块1030,用于通过所述第二代码动态链接库加载所述软件客户端的界面元素;
[0132] 脚本执行模块1040,用于通过所述第一代码动态链接库拦截所述第二代码动态链接库发送给所述软件客户端的加载完成通知,并调用所述第二代码动态链接库的编程接口,执行界面元素定位脚本。
[0133] 上述装置中各个模块的功能和作用的实现过程具体详见上述界面元素的定位方法中对应步骤的实现过程,在此不再赘述。
[0134] 在本申请所提供的几个实施例中,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0135] 另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
[0136] 功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read‑Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。