Post your working scripts, libraries and tools.
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 16 Nov 2023, 03:33
https://cn.bing.com/search?q=define+metaphorical&FORM=BESBTB&mkt=zh-CN&ensearch=1
How to set an Edit's value through another element, in that case through the Edit's upper text "Dictionary".
Code: Select all
word := "help"
dic_text := cUIA.WaitElement({Name:"Dictionary", Type:"Text"}).Highlight()
dic_text := UIA.TreeWalkerTrue.GetParentElement(dic_text)
dic_edit := dic_text.WalkTree("+3").Highlight()
dic_edit.Value := word
That code doesn't work, also it seems there is a problem of identify such Edit.
![Image](https://z1.ax1x.com/2023/11/16/pitnpp8.png)
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 16 Nov 2023, 11:15
@songdg
I'm not exactly sure what you mean by "through another element" and your provided code doesn't work in my setup (WalkTree throws an error). I assume that you are trying to get the Edit element from the "Dictionary" Text element? In that case something like
Code: Select all
word := "help"
dic_text := cUIA.WaitElement({Name:"Dictionary", Type:"Text"}).Highlight()
dic_edit := cUIA.FindElement({Type:"Edit", startingElement:dic_text})
dic_edit.Value := word
might be more reliable: it just finds the next Edit-type element in the tree. If you know that the Edit element is a sibling or a child then you can also use WalkTree with a filter condition, such as if it's a sibling then
dic_edit := dic_text.WalkTree("+1", {Type:"Edit"})
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 17 Nov 2023, 04:29
@Descolada
Thanks a lot, it's a clever work around, and in fact I can use cUIA.WaitElement({Name:"Enter a word", Type:"Edit"}).Highlight() to locate the edit directly.
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 27 Nov 2023, 10:43
What's the chrome version of scrolling, the code from the example dosen't work on chrome.
Code: Select all
cUIA := UIA_Browser()
docEl := cUIA.GetCurrentDocumentElement()
ToolTip "Current scroll percent: " docEl.VerticalScrollPercent
; Lets scroll down in steps of 10%
for percent in [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] {
docEl.VerticalScrollPercent := percent
Sleep 500
ToolTip "Current scroll percent: " docEl.VerticalScrollPercent
}
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 27 Nov 2023, 10:46
@songdg, Chrome doesn't support the ScrollPattern for its Document element, so it's not possible. However, it's possible to use Element.ScrollIntoView() to scroll certain elements into view, or you can inject Javascript to scroll.
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 27 Nov 2023, 11:16
@Descolada
I want to scroll to the Full Editor & Preview button on this page, but there's an error.
Error: Method ScrollIntoView not found in UIA.IUIAutomationElement Class.
Full_Editor := cUIA.FindElement({Name:"Full Editor & Preview", Type:"Button"}).Highlight()
Full_Editor.ScrollIntoView()
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 27 Nov 2023, 11:25
Worked fine without any errors here...
Code: Select all
#Requires Autohotkey v2
#Include UIA.ahk
#Include UIA_Browser.ahk
WinActivate "ahk_exe chrome.exe"
WinWaitActive "ahk_exe chrome.exe"
chrome := UIA.ElementFromHandle("ahk_exe chrome.exe")
Full_Editor := chrome.FindElement({Name:"Full Editor & Preview", Type:"Button"}).Highlight()
/* Alternatively:
cUIA := UIA_Browser("ahk_exe chrome.exe")
Full_Editor := cUIA.FindElement({Name:"Full Editor & Preview", Type:"Button"}).Highlight()
*/
Full_Editor.ScrollIntoView()
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 27 Nov 2023, 11:49
@Descolada
The problem persists.
Call stack:
D:\UIA-v2-main\Lib\UIA.ahk (1962) : [UIA.IUIAutomationElement.Prototype.__Call] Throw MethodError("Method " Name " not found in " this.__Class " Class.",-1,Name)
D:\UIA-v2-main\scroll2.ahk (14) : [] Full_Editor.ScrollIntoView()
> Auto-execute
![Image](https://z1.ax1x.com/2023/11/28/piB6RH0.png)
-
MiguelCt
- Posts: 2
- Joined: 28 Nov 2023, 05:08
Post
by MiguelCt » 28 Nov 2023, 08:15
Hi!
How do I find the path of an element that I have found with findElement?
I want to find out the path of this Edit element with the name: Razón social" (example: [6,1,1,X])
Code: Select all
#SingleInstance Force
#include UIA.ahk
#include UIA_Browser.ahk
+z::
{
firefoxEl := UIA.ElementFromHandle("Mozilla Firefox ahk_exe firefox.exe")
elementoInicial := firefoxEl.FindElement({Type:"Edit", Name:"Razón social:"}).Highlight().Dump()
msgbox elementoInicial
}
Thanks!
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 28 Nov 2023, 08:42
@MiguelCt, firefoxEl.GetNumericPath(elementoInicial) should return the numeric path, and firefoxEl.GetUIAPath(elementoInicial) the UIA path. Note that these methods will enumerate the starting elements subtree (in this case firefoxEl), so it will most likely be very slow and should be used sparingly. Also paths are unreliable in Firefox because they will depend on the tab order (if your starting point is the Firefox window, not a tab), and websites tend to have varying content which often breaks paths.
-
MiguelCt
- Posts: 2
- Joined: 28 Nov 2023, 05:08
Post
by MiguelCt » 28 Nov 2023, 10:09
Descolada wrote: ↑28 Nov 2023, 08:42
@MiguelCt,
firefoxEl.GetNumericPath(elementoInicial) should return the numeric path, and
firefoxEl.GetUIAPath(elementoInicial) the UIA path. Note that these methods will enumerate the starting elements subtree (in this case firefoxEl), so it will most likely be very slow and should be used sparingly. Also paths are unreliable in Firefox because they will depend on the tab order (if your starting point is the Firefox window, not a tab), and websites tend to have varying content which often breaks paths.
Thanks! Then I'll try with chrome, but my aproach (the only one I can think of (besides getting the whole html with your UIA_Browser ) is to find out the path of that element , and the others are suposed to be always in the same position relative to this one.
Thanks for UIA and for your help.
Greetings from Spain
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 29 Nov 2023, 14:12
@songdg, without injecting Javascript there isn't a way other than expanding the combobox, getting all the items, and then selecting the desired one. Eg for the "Custom controls" combobox in Chrome:
Code: Select all
#Requires AutoHotkey v2
#include UIA.ahk
WinActivate "ahk_exe chrome.exe"
WinWaitActive "ahk_exe chrome.exe"
chrome := UIA.ElementFromHandle("ahk_exe chrome.exe")
example := chrome.FindElement({Name:"Custom <select> example", Type:"Document"})
secondCB := example.FindElement({Name:"↓", Type:"Group", MatchMode:"Substring"})
secondCB.Invoke()
while (children := secondCB.FindElements({Type:"Group"}, UIA.TreeScope.Children)).Length < 2
Sleep 40
items := ""
for child in children {
items .= child.Name "|"
if InStr(child.Name, "peas")
pea := child
}
if IsSet(pea)
pea.Invoke()
MsgBox items
Personally I wouldn't use UIA to do this task, but I would either inject Javascript or use Chrome.ahk/Rufaydium etc to automate the browser directly.
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 30 Nov 2023, 10:07
@Descolada
https://business.linkedin.com/sales-solutions/contact-us
Thanks, maybe this page is more similar to the problem I currently face, I try to apply your example to select one item, but the code stuck at some point.
Code: Select all
WinActivate "ahk_exe chrome.exe"
WinWaitActive "ahk_exe chrome.exe"
chrome := UIA.ElementFromHandle("ahk_exe chrome.exe")
role_text := chrome.FindElement({Name:"Your role", Type:"Text"}).Highlight()
role_group := role_text .WalkTree("+1", {Type:"Group"}).Highlight()
role_group.ControlClick()
;role_group.Click() dosen't work
;role_group.Invoke() dosen't work
while (children := role_group.FindElements({Type:"Text"}, UIA.TreeScope.Children)).Length < 2
Sleep 40
items := ""
for child in children {
items .= child.Name "%"
if InStr(child.Name, "Job Seeker")
Job_Seeker := child
}
if IsSet(Job_Seeker)
Job_Seeker.Invoke()
MsgBox items
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 30 Nov 2023, 14:34
@songdg, apparently that LinkedIn pages combobox creates a new Chrome window to display the options, and that window isn't inspectable with Acc nor UIA. This unfortunately means it can't be automated with UIA.
Again, just use Javascript to get the values... Type this into the address bar and it shows all the roles:
javascript:var roles = document.querySelector("#role"); var result = ''; for (let item of roles) { result += item.value + "\n";}; alert(result);
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 01 Dec 2023, 00:09
@Descolada
What about click on a particular item? Since this is a new Chrome window, I wonder does that can be implemented like the context menu.
And what are the right syntax of using JSExecute, cUIA.JSExecute("roles = document.querySelector('#role'); var result = ''; for (let item of roles) { result += item.value + '\n';}; alert(result);"), that doesn't work.
-
songdg
- Posts: 655
- Joined: 04 Oct 2017, 20:04
Post
by songdg » 03 Dec 2023, 11:29
Descolada wrote: ↑30 Nov 2023, 14:34
@songdg, apparently that LinkedIn pages combobox creates a new Chrome window to display the options, and that window isn't inspectable with Acc nor UIA. This unfortunately means it can't be automated with UIA.
Again, just use Javascript to get the values... Type this into the address bar and it shows all the roles:
javascript:var roles = document.querySelector("#role"); var result = ''; for (let item of roles) { result += item.value + "\n";}; alert(result);
I find out just use textContent method also can get all the roles.
javascript:var roles = document.querySelector("#role"); alert(roles.textContent);
-
neogna2
- Posts: 600
- Joined: 15 Sep 2016, 15:44
Post
by neogna2 » 08 Dec 2023, 03:54
Small suggestion: in the viewer make the ~F1 hotkey able to toggle capture on and off (not just start capture). Because hotkey ~Esc passing through Esc in some windows causes an active element to close, whereas a passed through F1 more seldom does.
Seems the only code change needed is to comment out this line
https://github.com/Descolada/UIA-v2/blob/main/Lib/UIA.ahk#L7303
too hasty, will test more and suggest working change
-
Descolada
- Posts: 1273
- Joined: 23 Dec 2021, 02:30
Post
by Descolada » 09 Dec 2023, 02:09
@neogna2, I actually don't like the F1 hotkey either, because in some apps it opens a help dialog. How about the Print Screen button for both starting and stopping capturing?
-
neogna2
- Posts: 600
- Joined: 15 Sep 2016, 15:44
Post
by neogna2 » 09 Dec 2023, 04:50
Good point. Print Screen is seldomly used by apps so good in that way, though I've seen some new keyboards without a Print Screen key. Maybe default to PrintScreen and if not too much work make it user configurable in a static variable in the Viewer class?
https://github.com/Descolada/UIA-v2/blob/main/Lib/UIA.ahk#L7084
e.g.
static CaptureKey := "PrintScreen"