|
30 | 30 | _UIA_RANGEVALUE_PATTERN_ID = 10003 |
31 | 31 | _UIA_SCROLLITEM_PATTERN_ID = 10017 |
32 | 32 | _UIA_TEXT_PATTERN_ID = 10014 |
| 33 | +_UIA_ITEMCONTAINER_PATTERN_ID = 10019 |
| 34 | +_UIA_VIRTUALIZEDITEM_PATTERN_ID = 10020 |
| 35 | +_UIA_AUTOMATIONID_PROPERTY = 30011 |
33 | 36 | _EXPAND_STATES = {0: "collapsed", 1: "expanded", 2: "partial", 3: "leaf"} |
34 | 37 |
|
35 | 38 |
|
@@ -264,6 +267,37 @@ def get_range(self, name=None, role=None, app_name=None, |
264 | 267 | except (OSError, AttributeError, ValueError, TypeError): |
265 | 268 | return None |
266 | 269 |
|
| 270 | + def _realize(self, raw) -> None: |
| 271 | + """Realize a virtualized element so it materializes (VirtualizedItemPattern).""" |
| 272 | + pattern = self._pattern(raw, _UIA_VIRTUALIZEDITEM_PATTERN_ID, |
| 273 | + "IUIAutomationVirtualizedItemPattern") |
| 274 | + if pattern is None: |
| 275 | + return |
| 276 | + try: |
| 277 | + pattern.Realize() |
| 278 | + except (OSError, AttributeError): |
| 279 | + pass |
| 280 | + |
| 281 | + def find_virtual_item(self, item_name=None, by="name", container_name=None, |
| 282 | + container_role=None, app_name=None, automation_id=None): |
| 283 | + container = self._find_raw(container_name, container_role, app_name, |
| 284 | + automation_id) |
| 285 | + pattern = self._pattern(container, _UIA_ITEMCONTAINER_PATTERN_ID, |
| 286 | + "IUIAutomationItemContainerPattern" |
| 287 | + ) if container else None |
| 288 | + if pattern is None: |
| 289 | + return None |
| 290 | + property_id = (_UIA_AUTOMATIONID_PROPERTY if by == "automation_id" |
| 291 | + else _UIA_NAME_PROPERTY) |
| 292 | + try: |
| 293 | + found = pattern.FindItemByProperty(None, property_id, item_name) |
| 294 | + except (OSError, AttributeError, ValueError): |
| 295 | + return None |
| 296 | + if not found: |
| 297 | + return None |
| 298 | + self._realize(found) |
| 299 | + return _convert_uia(found) |
| 300 | + |
267 | 301 | def _text_pattern(self, name, role, app_name, automation_id): |
268 | 302 | """Find a control and return its IUIAutomationTextPattern, or None.""" |
269 | 303 | raw = self._find_raw(name, role, app_name, automation_id) |
|
0 commit comments