change screen resolution with AppleScript - applescript

I am trying to click at radio buttons in Displays panel of System Prefernces, namely to change Screen resolution. This is the code I use to identify radio buttons:
tell application "System Preferences"
activate
reveal anchor "displaysDisplayTab" of pane id "com.apple.preference.displays"
end tell
tell application "System Events"
tell application process "System Preferences"
set frontmost to true
get every radio button of window 0
--click button 1 of window 0 of application process "System Preferences" of application "System Events"
--click radio button "Scaled" of radio group of window "com.apple.preference.displays"
end tell
end tell
The radio buttons returned are none. Based on what I see, window has zero radio buttons. This leads to a conclusion that radio buttons are part of sub window, namely the Displays subwindow and not the main window. How can I navigate to this "subwindow" and click radiobuttons?

The radio buttons are part of the radio group. The radio group is part of the tab group.
Here's the script:
tell application "System Preferences"
activate
reveal anchor "displaysDisplayTab" of pane id "com.apple.preference.displays"
end tell
tell application "System Events"
tell application process "System Preferences"
set frontmost to true
tell tab group 1 of window 1
click radio button 2 of radio group 1 -- "Scaled"
select row 2 of table 1 of scroll area 1 -- select the second row in the table to change the resolution of the monitor
end tell
end tell
end tell

For Mac OS 10.15, you'll need this instead.
Set 'q' to the display button preference you want (1-4)
set tabNum to q as number
tell application "System Preferences" to reveal pane "com.apple.preference.displays"
tell application "System Events" to tell process "System Preferences"
set activeWindow to window 1
repeat until exists activeWindow
end repeat
set tabGroup to tab group 1 of activeWindow
tell tabGroup to click radio button "Scaled"
set subGroup to group 1 of tabGroup
set radioGroup to radio group 1 of subGroup
tell radioGroup to click radio button tabNum
--log activeWindow
--delay 0.5
tell application "System Preferences"
quit
end tell
end tell

Related

How to click the checkbox of a System Preferences UI element by name

I've got a piece of Applescript that is currently functional and clicks a checkbox in System Prefs > Security & Privacy > Contacts. However, right now it only works because I am explicitly stating the row of the app that I'm targeting (in this case, row 2). This works fine for now, but if in the future I end up with a different app order in that pane, it will break. Is there a way to loop through all the items of a given window and say "if UI element is Alfred 4.app, then click the checkbox"? I'd like to harden the code so that it will work regardless of which order the apps are listed in this pane.
set appName to "Alfred 4.app"
tell application "System Preferences"
activate
set the current pane to pane id "com.apple.preference.security.Privacy_Contacts"
delay 1
end tell
tell application "System Events"
click checkbox 1 of UI element appName of row 2 of table 1 of scroll area 1 of group 1 of tab group 1 of window "Security & Privacy" of application process "System Preferences"
end tell
Following script is tested on the Catalina:
set appName to "Alfred 4.app"
tell application "System Preferences"
activate
reveal anchor "Privacy_Contacts" of pane id "com.apple.preference.security"
end tell
delay 1
tell application "System Events" to tell process "System Preferences"
repeat with aRow in (rows of table 1 of scroll area 1 of group 1 of tab group 1 of window "Security & Privacy")
if name of UI element 1 of aRow is appName then
click checkbox 1 of UI element 1 of aRow
exit repeat
end if
end repeat
end tell

AppleScript to Connect Bluetooth Device in Monterey (12.0.1)

I want to write a simple script to connect my MacBook to the bluetooth speaker in my living room, but I can't figure out the final click.
-- Turn Bluetooth on
tell application "System Preferences"
activate
reveal pane "com.apple.preferences.Bluetooth"
end tell
delay 1
tell application "System Events"
tell process "System Preferences"
if button "Turn Bluetooth On" of window "Bluetooth" exists then
click button "Turn Bluetooth On" of window "Bluetooth"
end if
end tell
end tell
-- Connect Living Room speakers
tell application "System Events"
tell process "ControlCenter"
set BluetoothButton to menu bar item "Bluetooth" of menu bar 1
click BluetoothButton --This works and makes the dialog pop up
delay 3
set TheCheckbox to button "Living Room" of scroll area 1 of window "Control Centre"
if TheCheckbox exists then return "Yay"
if value of TheCheckbox is 0 then click TheCheckbox
end tell
end tell
-- This is how to do it through the System Preferences
-- But this doesn't work because there's no way to double click the device in the bluetooth menu
(*set thePathPref to (path to library folder from system domain as text) & "PreferencePanes:"
tell application "System Preferences"
activate
reveal pane "com.apple.preferences.Bluetooth"
end tell
delay 1
tell application "System Events"
tell process "System Preferences"
if button "Turn Bluetooth On" of window "Bluetooth" exists then
click button "Turn Bluetooth On" of window "Bluetooth"
end if
delay 1
set LivingRoomButton to UI element "Living Room" of row 3 of table 1 of scroll area 1 of window "Bluetooth" of application process "System Preferences" of application "System Events"
--if LivingRoomButton exists then
click LivingRoomButton -- Needs to be a double click but that's impossible
--end if
end tell
end tell
*)
If I
return every UI element of window "Control Centre"
I get {} back, which makes me think window "Control Centre" isn't the right place to be looking for the button, but using an application called UI Browser, that definitely seems like where it lives. So I don't know what to do.
As it stands I get the error "System Events got an error: Can’t get scroll area 1 of window "Control Centre" of process "ControlCenter". Invalid index." on the line
set TheCheckbox to button "Living Room" of scroll area 1 of window "Control Centre"
This is an old question, but the 1st result in a search so I'll answer here. This works for me in 12.6:
tell application "System Events" to tell process "ControlCenter"
click menu bar item "Bluetooth" of menu bar 1
repeat until exists of checkbox 1 of scroll area 1 of window 1
delay 0.1
end repeat
repeat with uiElem in checkboxes of scroll area 1 of window 1 as list
if name of uiElem = "Your_device_name_here" then
click uiElem
end if
end repeat
key code 53 -- # escape key to close the window
end tell
I don't have a Bluetooth speaker, but I use the following script to connect to my HomePod (Airplay). The HomePod shows up in the list under System Preferences -> Sound. If your Bluetooth speaker shows up in that list as well, this script should work on macOS 12 Monterey:
set outPutSrc to "Living Room"
tell application "System Preferences"
reveal anchor "output" of pane id "com.apple.preference.sound"
activate
tell application "System Events"
tell process "System Preferences"
try
delay 1
select (row 1 of table 1 of scroll area 1 of tab group 1 of window "Sound" whose value of text field 1 is outPutSrc)
end try
end tell
end tell
quit
end tell

Using AppleScript to uncheck HDR in system preferences

I have a 4K HDR Monitor, and sometimes Macbook causes the colors to be washed, the fix is to Disable and then Re-Enable HDR.
I am trying to create an AppleScript to then incorporate that in Automator to do so.
I was able to get some traction but not able to identify how to do the actual uncheck and identify the group.
Here is what i had so far:
tell application "System Preferences"
activate
delay 2
set the current pane to pane id "com.apple.preference.displays"
delay 2
tell application "System Events"
click checkbox "High Dynamic Range" of group 2 of window "LG HDR 4K" of application process "System Preferences"
end tell
quit end tell
Here is the error I get:
error "System Events got an error: Can’t get group 2 of window \"LG HDR 4K\" of application process \"System Preferences\". Invalid index." number -1719 from group 2 of the window "LG HDR 4K" of application process "System Preferences"
here is a screenshot of the page I am trying to uncheck and re-check HDR:
Any advice would be appreciated, thank you.
I don't have a high-def display, so I don't see this particular option, but if I run the following code, I get a full list of all the subelements of the window:
tell application "System Preferences"
activate
delay 2
set the current pane to pane id "com.apple.preference.displays"
delay 2
tell application "System Events"
tell window 1 of application process "System Preferences"
entire contents
end tell
end tell
end tell
Subelements you are interested in seem to have the following form:
radio button "Scaled" of tab group 1 of window "Built-in Retina Display" of application process "System Preferences" of application "System Events"
Note that it includes a tab group 1 entry (referring to the fact that you are on the 'Display' tab of the four tabs available which is missing from your chain.
The Display pane UI layout has changed a bit in macOS Monterey, and now looks like this:
Display Prefs UI Layout
In my case I wanted to enable HDR on my second monitor, so using the following code I was able to get Script Editor to test whether the High Dynamic Range checkbox was true or false, and if false to enable it:
tell application "System Preferences"
activate
delay 1
set the current pane to pane id "com.apple.preference.displays"
delay 1
tell application "System Events"
click button "Display Settings…" of window "Displays" of application process "System Preferences" of application "System Events"
delay 1
tell sheet 1 of window 1 of application process "System Preferences"
select row 2 of outline 1 of scroll area 1
set theCheckbox to checkbox "High Dynamic Range, Automatically adjust the display to show high dynamic range content."
tell theCheckbox
set checkboxStatus to value of theCheckbox as boolean
if checkboxStatus is false then click theCheckbox
end tell
end tell
end tell
end tell
If I wanted to select a different monitor, I would change the index of "row 2" in this line:
select row 2 of outline 1 of scroll area 1 of sheet 1 of window "Displays" of application process "System Preferences" of application "System Events"

in the GUI script below, why isn't "click button "Advanced..." working?

tell application "System Preferences"
activate
end tell
tell application "System Events"
set preferencesLocked to false
tell process "System Preferences"
delay 1
click menu item "Security & Privacy" of menu "View" of menu bar 1
delay 2.5
if title of button 4 of window 1 is "Click the lock to make changes." then
set preferencesLocked to true
click button "Click the lock to make changes." of window 1
end if
end tell
if preferencesLocked is true then
delay 2.5
activate application "SecurityAgent"
tell application "System Events"
tell process "SecurityAgent"
set value of text field 1 of scroll area 1 of group 1 of window 1 to "admin"
set value of text field 2 of scroll area of group 1 of window 1 to "XXXXXXX"
click button "Unlock" of group 2 of window 1
tell application "System Events"
tell process "SecurityAgent"
**click button "Advanced..."**
end tell
end tell
end tell
end tell
end if
end tell
You just have to replace the three periods with an ellipsis character:
tell application "System Preferences"
reveal pane id "com.apple.preference.security"
activate
end tell
tell application "System Events"
if title of button 4 of window 1 of process "System Preferences" is "Click the lock to make changes." then
click button "Click the lock to make changes." of window 1 of process "System Preferences"
delay 5
tell process "SecurityAgent"
set value of text field 2 of scroll area 1 of group 1 of window 1 to "password"
click button 2 of group 2 of window 1
end tell
end if
tell process "System Preferences"
click button "Advanced…" of window 1
end tell
end tell

How to AppleScript the launching of sound.profPane?

I have this script
tell application "System Preferences"
activate
set the current pane to pane id "com.apple.preference.sound"
reveal anchor "Output" of pane id "com.apple.preference.sound"
end tell
The problem is that it first goes to the general configuration, with all those icons, only then, it focuses on sound. This create a quick and annoying flicker. I am only interested in the sound pane.
Is there nay way I can write a script that'll show JUST the sound pane without that flickering?
thanks!
You can just use the reveal command directly:
tell application "System Preferences"
activate
reveal anchor "output" of pane id "com.apple.preference.sound"
end tell
If you are using UI scripting, the activate command can also be left out:
tell application "System Preferences"
reveal anchor "output" of pane id "com.apple.preference.sound"
end tell
tell application "System Events" to tell process "System Preferences"
tell table 1 of scroll area 1 of tab group 1 of window 1
if selected of row 1 then
set selected of row 2 to true
else
set selected of row 1 to true
end if
end tell
end tell

Resources