鱼C论坛

 找回密码
 立即注册
查看: 149|回复: 13

uiautomation 定位不到控件

[复制链接]
发表于 2024-11-4 14:24:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在玩 UI 自动化;


用的是 uiautomation 模块;    使用inspect 来定位’控件元素,  

目前遇到一个问题 ,    程序 打开 后   明明可视有 三个 编辑框     但却定位不到 这三个编辑框的控件。
bs = auto.WindowControl(ProcessId=process.pid)


time.sleep(2)
# 检查窗口是否存在
if bs.Exists(1, 0):  # 参数1表示最多搜索1秒,0表示不打印未找到控件的信息
    print("窗口成功获取")
    bs.SetActive()  # 窗口置顶
else:
    print("窗口获取失败")


for child in bs.GetChildren():
    print( f"""
        子控件标题:{child.Name}, 
        类型名称:{child.ControlTypeName},
        控件类型:{child.ControlType}, 
        控件 ID:{child.AutomationId}, 
        类名:{child.ClassName}, 
        位置:{child.BoundingRectangle}"""
        )




 



输出内容如下:
口成功获取

        子控件标题:,
        类型名称:EditControl,
        控件类型:50004,
        控件 ID:,
        类名:RichEdit20W,
        位置:(856,488,1914,1226)[1058x738]

        子控件标题:,
        类型名称:TreeControl,
        控件类型:50023,
        控件 ID:,
        类名:UITreeView,
        位置:(379,488,851,1226)[472x738]

        子控件标题:,
        类型名称:ToolBarControl,
        控件类型:50021,
        控件 ID:100,
        类名:ToolbarWindow32,
        位置:(379,456,1914,492)[1535x36]

        子控件标题:,
        类型名称:TitleBarControl,
        控件类型:50037,
        控件 ID:,
        类名:,
        位置:(403,384,1914,426)[1511x42]

        子控件标题:应用程序,
        类型名称:MenuBarControl,
        控件类型:50010,
        控件 ID:MenuBar,
        类名:,
        位置:(253,284,1276,303)[1023x19]








inspect.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-4 14:24:34 | 显示全部楼层
在使用 `uiautomation` 模块进行 UI 自动化时,遇到无法定位编辑框的问题可能有多种原因。以下是一些可能的解决方案和建议:

1. **检查控件层级**:有时候,控件可能嵌套在其他控件中。尝试递归地获取子控件,或者使用 `GetDescendants()` 方法来获取所有子孙控件。

2. **增加等待时间**:有可能控件还没有完全加载出来。尝试增加 `time.sleep()` 的时间,确保控件已经完全加载。

3. **使用不同的属性定位**:有时候 `AutomationId` 或 `Name` 可能为空,尝试使用其他属性如 `ClassName` 或 `BoundingRectangle` 来定位控件。

4. **检查控件的可见性**:有些控件可能是不可见的,确保控件是可见的并且可以被自动化工具识别。

5. **更新工具和库**:确保 `uiautomation` 模块和 `inspect` 工具是最新版本,有时候更新可以解决兼容性问题。

6. **调试输出**:在获取控件时,输出更多的调试信息,查看是否有其他控件信息被遗漏。

如果以上方法仍然无法解决问题,建议检查目标应用程序是否对自动化工具有限制,或者尝试使用其他自动化工具(如 Pywinauto 或 Appium)进行测试。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 14:28:29 | 显示全部楼层
FishC 发表于 2024-11-4 14:24
在使用 `uiautomation` 模块进行 UI 自动化时,遇到无法定位编辑框的问题可能有多种原因。以下是一些可能的 ...

BoundingRectangle 怎么定位; ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-4 14:28:56 | 显示全部楼层
makliu 发表于 2024-11-04 14:28
BoundingRectangle 怎么定位; ?


在使用 `uiautomation` 模块时,`BoundingRectangle` 是一个表示控件在屏幕上位置和大小的属性。要通过 `BoundingRectangle` 定位控件,可以使用该属性的坐标信息来进行进一步的操作。以下是一些方法和步骤:

1. **获取控件的 `BoundingRectangle`**:
   - `BoundingRectangle` 通常是一个包含四个值的元组 `(left, top, right, bottom)`,表示控件的左上角和右下角的坐标。

2. **使用坐标进行定位**:
   - 你可以使用这些坐标来模拟鼠标点击或其他操作。例如,使用 `pyautogui` 库来移动鼠标到控件的位置并进行点击。

3. **示例代码**:
   - 下面是一个简单的示例,展示如何使用 `BoundingRectangle` 的坐标来进行鼠标点击:
import uiautomation as auto
import pyautogui

# 假设你已经获取了控件对象 control
bounding_rect = control.BoundingRectangle

# 计算控件的中心点
center_x = (bounding_rect[0] + bounding_rect[2]) // 2
center_y = (bounding_rect[1] + bounding_rect[3]) // 2

# 移动鼠标到控件的中心并点击
pyautogui.moveTo(center_x, center_y)
pyautogui.click()

4. **注意事项**:
   - 确保控件在屏幕上是可见的,否则可能无法正确定位。
   - 使用 `pyautogui` 时,确保安装了该库,并且在使用时注意屏幕分辨率和缩放设置。

通过这些步骤,你可以利用 `BoundingRectangle` 来定位和操作控件。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 15:13:49 | 显示全部楼层
FishC 发表于 2024-11-4 14:28
在使用 `uiautomation` 模块时,`BoundingRectangle` 是一个表示控件在屏幕上位置和大小的属性。要通过 ...

如果已经定位 到了这个 编辑框,   怎么清空 已有的内容?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-4 15:14:11 | 显示全部楼层
makliu 发表于 2024-11-04 15:13
如果已经定位 到了这个 编辑框,   怎么清空 已有的内 ...


要清空已经定位到的编辑框的内容,可以使用 `uiautomation` 模块提供的方法。通常,你可以使用 `SendKeys` 方法发送一个全选(Ctrl+A)然后删除(Delete)键的组合来清空文本框。以下是一个示例代码:
import uiautomation as auto

# 假设你已经获取了编辑框控件对象 edit_control
edit_control = auto.EditControl(Name='YourEditControlName')

# 将编辑框置于活动状态
edit_control.SetFocus()

# 发送 Ctrl+A 全选,然后发送 Delete 键清空内容
edit_control.SendKeys('^a{Delete}')

在这个示例中:

- `SetFocus()` 方法用于将编辑框置于活动状态,以确保后续的键盘输入能够正确作用于该控件。
- `SendKeys('^a{Delete}')` 发送了 Ctrl+A(全选)和 Delete(删除)键的组合,以清空编辑框的内容。

请根据实际情况替换 `YourEditControlName` 为你实际的控件名称或其他定位方式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 15:15:37 | 显示全部楼层
FishC 发表于 2024-11-4 15:14
要清空已经定位到的编辑框的内容,可以使用 `uiautomation` 模块提供的方法。通常,你可以使用 `SendKe ...

输入了 ^A  文本,  而不是全选。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-4 15:15:57 | 显示全部楼层
makliu 发表于 2024-11-04 15:15
输入了 ^A  文本,  而不是全选。。


在使用 `uiautomation` 的 `SendKeys` 方法时,可能会遇到某些键组合没有按预期工作的情况。为了确保发送的键组合能够正确执行全选和删除操作,可以尝试以下方法:

1. **分开发送按键**:有时候分开发送按键会更有效。
import uiautomation as auto

# 假设你已经获取了编辑框控件对象 edit_control
edit_control = auto.EditControl(Name='YourEditControlName')

# 将编辑框置于活动状态
edit_control.SetFocus()

# 发送 Ctrl 键按下
edit_control.SendKeys('^')

# 发送 A 键
edit_control.SendKeys('a')

# 发送 Delete 键
edit_control.SendKeys('{Delete}')

2. **使用 `Ctrl` 和 `A` 的组合**:确保 `SendKeys` 方法支持的格式正确。

如果以上方法仍然无法解决问题,可能需要检查控件是否正确响应键盘事件,或者尝试使用其他方法来清空文本框内容。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-4 15:18:08 | 显示全部楼层
FishC 发表于 2024-11-4 15:15
在使用 `uiautomation` 的 `SendKeys` 方法时,可能会遇到某些键组合没有按预期工作的情况。为了确保发 ...

如果 控件不允许  全选呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-4 15:18:37 | 显示全部楼层
makliu 发表于 2024-11-04 15:18
如果 控件不允许  全选呢


如果控件不允许全选,你可以尝试以下方法来清空编辑框的内容:

1. **逐字符删除**:使用 `Backspace` 键逐字符删除内容。
import uiautomation as auto

# 假设你已经获取了编辑框控件对象 edit_control
edit_control = auto.EditControl(Name='YourEditControlName')

# 将编辑框置于活动状态
edit_control.SetFocus()

# 获取当前文本长度
text_length = len(edit_control.GetValuePattern().Value)

# 逐字符删除
for _ in range(text_length):
    edit_control.SendKeys('{Backspace}')

2. **直接设置为空字符串**:如果控件支持 `ValuePattern`,可以直接设置其值为空字符串。
import uiautomation as auto

# 假设你已经获取了编辑框控件对象 edit_control
edit_control = auto.EditControl(Name='YourEditControlName')

# 直接设置值为空字符串
edit_control.GetValuePattern().SetValue('')

这两种方法可以在控件不支持全选的情况下清空文本内容。根据控件的具体实现,选择适合的方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-5 11:33:19 | 显示全部楼层
FishC 发表于 2024-11-4 15:18
如果控件不允许全选,你可以尝试以下方法来清空编辑框的内容:

1. **逐字符删除**:使用 `Backspace ...

uiautomation  python  怎么判断  树形 控件是否 展开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-5 12:00:03 | 显示全部楼层
makliu 发表于 2024-11-05 11:33
uiautomation  python  怎么判断  树形 控件是否 展开


在使用 `uiautomation` 模块操作树形控件时,可以通过检测控件的状态来判断树节点是否展开。树形控件通常使用 `ExpandCollapsePattern` 来管理展开和折叠状态。以下是如何判断树节点是否展开的示例:
import uiautomation as auto

# 假设你已经获取了一个树形控件的 TreeItemControl 对象 tree_item
tree_item = auto.TreeItemControl(Name='YourTreeItemName')

# 获取 ExpandCollapsePattern 对象
expand_collapse_pattern = tree_item.GetExpandCollapsePattern()

# 判断是否展开
if expand_collapse_pattern.CurrentExpandCollapseState == auto.ExpandCollapseState_Expanded:
    print("树节点已展开")
else:
    print("树节点未展开")

在这个例子中:

- `ExpandCollapsePattern` 是用于控制树节点展开和折叠的模式。
- `CurrentExpandCollapseState` 属性可以获取当前的展开状态。
  - `ExpandCollapseState_Expanded`: 表示节点已展开。
  - `ExpandCollapseState_Collapsed`: 表示节点已折叠。

请根据需要替换 `YourTreeItemName` 为实际的树节点名称或其他识别标识。通过这种方式,可以方便地判断树节点是否处于展开状态。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-5 12:22:37 | 显示全部楼层
FishC 发表于 2024-11-5 12:00
在使用 `uiautomation` 模块操作树形控件时,可以通过检测控件的状态来判断树节点是否展开。树形控件通 ...

报错  if expand_collapse_pattern.CurrentExpandCollapseState == auto.ExpandCollapseState_Expanded:
AttributeError: 'NoneType' object has no attribute 'CurrentExpandCollapseState'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-5 12:28:54 | 显示全部楼层
makliu 发表于 2024-11-05 12:22
报错  if expand_collapse_pattern.CurrentExpandColl ...


`AttributeError: 'NoneType' object has no attribute 'CurrentExpandCollapseState'` 错误通常表示没有成功获取到 `ExpandCollapsePattern` 对象。这可能是因为目标控件并不支持 `ExpandCollapsePattern`。以下是可能的解决办法:

1. **检查控件是否支持 `ExpandCollapsePattern`**:首先,需要确保控件支持 `ExpandCollapsePattern`。可以使用 `PatternInterface` 方法进行检查。
import uiautomation as auto

# 假设你已经获取了一个树形控件的 TreeItemControl 对象 tree_item
tree_item = auto.TreeItemControl(Name='YourTreeItemName')

# 检查控件是否支持 ExpandCollapsePattern
if tree_item.ControlPatternIds.ExpandCollapsePattern in tree_item.GetSupportedPatterns():
    expand_collapse_pattern = tree_item.GetExpandCollapsePattern()
    
    # 判断是否展开
    if expand_collapse_pattern.CurrentExpandCollapseState == auto.ExpandCollapseState_Expanded:
        print("树节点已展开")
    else:
        print("树节点未展开")
else:
    print("控件不支持 ExpandCollapsePattern")

2. **确保正确的控件类型**:有时您可能获取的控件不是 `TreeItemControl`。请确认获取的是正确类型的控件。
# 确保你获取的控件类型是 TreeItemControl
tree_item = auto.TreeItemControl(Name='YourTreeItemName')
print(tree_item.ControlType)

3. **调试输出**:输出当前控件的所有支持的模式,以确保识别错误或者其他情况。
# 输出支持的模式
supported_patterns = tree_item.GetSupportedPatterns()
print("支持的模式ID:", supported_patterns)

4. **更新或检查控件层级**:有些控件需要在特定的层级获取子控件,确保树节点是正确的控件实例。

通过这些步骤,您应该能够诊断和处理没有找到 `ExpandCollapsePattern` 的问题。确保您采用的控件是正确的类型并支持您要使用的功能。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表