基于Flaui的xpath,实现winui自动化操作

By 瞌睡蟲子 at 2023-02-02 • 0人收藏 • 711人看过

aardio自带了MSAA,UIA的相关库,MSAA库还好,UIA的库写起来太麻烦了,又懒得封装。于是找找现成的库直接玩玩

测试代码:

import console;
import dotNet;
import mouse;

var Core = dotNet.load("FlaUI.Core","D:\Program Files (x86)\flaUI\Libs\FlaUI.Core.dll");
var UIA2 = dotNet.load("FlaUI.UIA2","D:\Program Files (x86)\flaUI\Libs\FlaUI.UIA2.dll");
var UIA3 = dotNet.load("FlaUI.UIA3","D:\Program Files (x86)\flaUI\Libs\FlaUI.UIA3.dll");
var Interop = dotNet.load("Interop.UIAutomationClient","D:\Program Files (x86)\flaUI\Libs\Interop.UIAutomationClient.dll");

Application = Core.import("FlaUI.Core.Application");
AutomationType = UIA3.new("FlaUI.UIA3.UIA3Automation");
TimeSpan = dotNet.import("System.TimeSpan","mscorlib.dll")

var app = Application.Attach("WeChat.exe");
console.log(app)
var window = app.GetMainWindow(AutomationType,TimeSpan.FromSeconds(2.0));
if(window){
	console.log(window.Title)
	var ele = window.FindFirstByXPath("/Pane[3]/Pane[2]/Pane[3]/Pane/Pane/Pane/Pane/Pane[2]/Pane[2]/Pane[2]/Pane/Pane[1]/Edit")
	//window.FindAllByXPath("")
	console.log(ele)
	console.log(ele.BoundingRectangle)
	window.SetForeground()
	var rect = ele.BoundingRectangle; 
	x,y = rect.x + rect.Width/2 , rect.y + rect.Height/2
	mouse.click(x,y,true)
}


console.pause()

运行效果

image.png

dll直接从工具里面copy过来:

https://github.com/FlaUI/FlaUInspect/releases/tag/v1.3.0

10 个回复 | 最后更新于 2023-02-03
2023-02-02   #1

补充一个WPath实现的xpath

demo:

import dotNet
import System.Windows.Automation
import console

var WPath = dotNet.load("WPath",$"/res/WPath.dll"); 
var eng = WPath.import("WPath.UiaExtension"); 

var root = System.Windows.Automation.AutomationElement.RootElement; 

var app = eng.FindByWPath(root,"//Window[@Name='微信']")
console.log(app.Current.Name)
console.log(app.Current.BoundingRectangle)
console.pause()

dll下载地址:

https://github.com/tobyqin/wpath/releases/tag/v1.0

2023-02-02   #2

这种Ui的操作屏幕分辨率有要求吗?


2023-02-02   #3

谢谢分享,学习了新技能

2023-02-02   #4

回复#2 @hi_aardio :

没有详细测试过,鼠键操作,dpi有影响。缩放最好保持100%

2023-02-02   #5

回复#1 @瞌睡蟲子 :

请教,有没有好一点的工具用来探测窗口的层级及属性

2023-02-02   #6

感谢分享, 学习了

2023-02-02   #7

回复#5 @hi_aardio :

FlaUInspect本身就是工具,Inspect也是

2023-02-02   #8

封装了wpath库,方便调用

WPath.aardio

import dotNet
import System.Windows.Automation

if(table.getByNamespace("WPath")){
	return;
}

var assembly = dotNet.load("WPath",$"/res/WPath.dll"); 
assembly.import("WPath.UiaExtension"); 

root = System.Windows.Automation.AutomationElement.RootElement; 

function wpath(xpath,ele){
	ele := root
	return WPath.UiaExtension.FindByWPath(ele,xpath);
}


/**intellisense()
WPath.UiaExtension = winui元素WPath查找\n
WPath.UiaExtension.FindByWPath(.(指定AutomationElement元素,xpath表达式) = WPath查找winui元素,默认桌面元素root。\n!autoEle.
wpath(.(xpath,指定AutomationElement元素) = WPath查找winui元素,默认桌面元素root。
end intellisense**/

调用代码

import WPath;
import console;

var ee = wpath("/window[@Name='微信']//edit[@Name='输入']");
console.log(ee.Current.BoundingRectangle )
console.pause()


2023-02-03   #9

flaui从桌面开始查找

import console;
import dotNet;
import mouse;


var assembly = dotNet.load("FlaUI",$"/res/FlaUI.dll");
assembly.import("FlaUI.UIA3");

root = FlaUI.UIA3.UIA3Automation().GetDesktop();

var tm = time.tick(); 
var ele = root.FindFirstByXPath("/Window[@Name='微信']//Edit[@Name='输入']")
console.log(time.tick()-tm);
console.log(ele)
console.log(ele.BoundingRectangle)
ele.SetForeground()
sleep(3000)
var rect = ele.BoundingRectangle; 
x,y = rect.x + rect.Width/2 , rect.y + rect.Height/2
mouse.click(x,y,true)

console.pause()


2023-02-03   #10

回复#7 @瞌睡蟲子 :

登录后方可回帖

登 录
信息栏
 非官方,私人站

本站域名

Aardio.com.cn

备用域名

ChengXu.XYZ

请相互转告!
投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方     |     Aardio官方更新日志
Sciter在线学习文档
才仁机械
Stm32cube中文网
Loading...