Salut Patrick !
Le TreeWalker est utile quand on ne connait pas le modèle objet de la page sous UI Automation (différent du DOM)
mais peut-être très long selon les niveaux de profondeur de recherche !
Là t'as du bol car la fenêtre est directement au premier niveau derrière la racine
et la classe du bandeau aussi au premier niveau derrière la fenêtre.
Mieux vaut cibler directement l'élément recherché (tests sous IE9 mais je ne pense pas que cela diffère pour IE11) :
• Si vraiment tu veux cibler le bandeau d'IE, alors comme indiqué dans le post #225 par son volet …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Sub DemoBandeauIE1()
Dim oAC As IUIAutomationCondition, oAE As IUIAutomationElement, oIE As IUIAutomationElement, oCUIA As New CUIAutomation, D As Date
Set oAC = oCUIA.CreatePropertyCondition(UIA_ClassNamePropertyId, "IEFrame")
'ou Set oAC = oCUIA.CreateAndCondition(oCUIA.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeId), _
oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Téléchargement des cotations pour - Windows Internet Explorer"))
Set oIE = oCUIA.GetRootElement.FindFirst(TreeScope_Children, oAC)
If oIE Is Nothing Then
MsgBox "Fenêtre absente !", vbExclamation
Else
D = Now + 10 / 86400
Set oAC = oCUIA.CreateAndCondition(oCUIA.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_PaneControlTypeId), _
oCUIA.CreatePropertyCondition(UIA_ClassNamePropertyId, "Frame Notification Bar"))
Do
If Now > D Then Exit Do
Set oAE = oIE.FindFirst(TreeScope_Children, oAC)
Loop While oAE Is Nothing
If oAE Is Nothing Then MsgBox "Timeout !", vbExclamation Else MsgBox "Bandeau présent !", vbInformation
Set oAC = Nothing: Set oAE = Nothing: Set oIE = Nothing: Set oCUIA = Nothing
End If
End Sub |
Les lignes n°4 & 5 représentent une alternative en cas de plusieurs fenêtres d'IE de trouver la bonne par son type et son nom …
Lignes n°11 & 12 : la condition de la classe seule peut suffire, là j'ai combiné avec une condition de type volet …
• … Ou encore comme précisé dans ce post #225 par sa barre d'outils …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Sub DemoBandeauIE2()
Dim oAC As IUIAutomationCondition, oAE As IUIAutomationElement, oIE As IUIAutomationElement, oCUIA As New CUIAutomation, D As Date
Set oAC = oCUIA.CreatePropertyCondition(UIA_ClassNamePropertyId, "IEFrame")
'ou Set oAC = oCUIA.CreateAndCondition(oCUIA.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeId), _
oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Téléchargement des cotations pour - Windows Internet Explorer"))
Set oIE = oCUIA.GetRootElement.FindFirst(TreeScope_Children, oAC)
If oIE Is Nothing Then
MsgBox "Fenêtre absente !", vbExclamation
Else
D = Now + 10 / 86400
Set oAC = oCUIA.CreateAndCondition(oCUIA.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_ToolBarControlTypeId), _
oCUIA.CreatePropertyCondition(UIA_ClassNamePropertyId, "DirectUIHWND"))
' ou à la place de la classe le nom : oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Barre de notification"))
Do
Set oAE = oIE.FindFirst(TreeScope_Descendants, oAC)
Loop While oAE Is Nothing And Now < D
If oAE Is Nothing Then MsgBox "Timeout !", vbExclamation Else MsgBox "Bandeau présent !", vbInformation
Set oAC = Nothing: Set oAE = Nothing: Set oIE = Nothing: Set oCUIA = Nothing
End If
End Sub |
Comparer la ligne de code n°15 avec celle de la première démonstration !
• Mais comme le laisse supposer l'extrait de code du post #227 (Firefox ou IE : même combat !),
trouver le bandeau n'est pas nécessaire car le bouton peut directement être recherché dans la fenêtre UI Automation,
le but final étant de cliquer sur ce bouton !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Sub DemoBoutonIE()
Dim oAC As IUIAutomationCondition, oAE As IUIAutomationElement, oIE As IUIAutomationElement, oCUIA As New CUIAutomation, D As Date
Set oAC = oCUIA.CreatePropertyCondition(UIA_ClassNamePropertyId, "IEFrame")
'ou Set oAC = oCUIA.CreateAndCondition(oCUIA.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeId), _
oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Téléchargement des cotations pour - Windows Internet Explorer"))
Set oIE = oCUIA.GetRootElement.FindFirst(TreeScope_Children, oAC)
If oIE Is Nothing Then
MsgBox "Fenêtre absente !", vbExclamation
Else
D = Now + 10 / 86400
Set oAC = oCUIA.CreateAndCondition(oCUIA.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_ButtonControlTypeId), _
oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Ouvrir"))
Do
Set oAE = oIE.FindFirst(TreeScope_Descendants, oAC)
Loop While oAE Is Nothing And Now < D
If oAE Is Nothing Then MsgBox "Timeout !", vbExclamation Else MsgBox "Bouton présent !", vbInformation
Set oAC = Nothing: Set oAE = Nothing: Set oIE = Nothing: Set oCUIA = Nothing
End If
End Sub |
Les conditions de recherche des lignes de code n°11 & 12 sont pour un bouton nommé "Ouvrir"
mais si l'élément recherché est le seul ou le premier dans la structure de l'objet racine de la recherche à porter ce nom
alors la condition seule sur son nom est suffisante comme dans l'extrait de code du post #227 …
Partager