AppleScript: set Safari tab to specific index

applescriptsafari

I have an AppleScript which search for tab and run a JS in the selected tab,
It's work because of this :

set current tab of w to t
        set index of w to 1

but I would like to improve the code so I can refer the tab, at the moment as you can see I'm only referring the window ID and it's ok when I know the tab number
but how can I also refer the tab?

do JavaScript "document.getElementsByClassName('myJShere')[0].click();" in tab tab 1 of window id theWindowID

I tried set theTabNumber to (id of t as string) but that doesn't work

t in my current example, return item 3 of {tab 1 of window id 6615 of application "Safari", tab 2 of window id 6615 of application "Safari", tab 3 of window id 6615 of application "Safari", tab 4 of window id 6615 of application "Safari"}

I tried :

set theTabNumber to item 1 of t
return theTabNumber

but this return

tab 3 of window id 6615 of application "Safari"

I suppose I could use text delimiting but that doesn't seems right

full script

set theTABID to 0
set searchpat to "Facebook"

tell application "Safari"
    set winlist to every window
    set winmatchlist to {}
    set tabmatchlist to {}
    set tabnamematchlist to {}
    repeat with win in winlist
        set ok to true
        try
            set tablist to every tab of win
        on error errmsg
            --display dialog name of win as string
            set ok to false
        end try
        if ok then
            repeat with t in tablist
                if searchpat is in (name of t as string) then
                    set end of winmatchlist to win
                    set end of tabmatchlist to t
                    set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (name of t as string)
                    set theTABID to (id of win as string)
                    ##return (index of t as string)
                    --display dialog name of t as string
                else if searchpat is in (URL of t as string) then
                    set end of winmatchlist to win
                    set end of tabmatchlist to t
                    set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (URL of t as string)
                    --display dialog name of t as string
                end if
            end repeat
        end if
    end repeat
    
    set w to item 1 of winmatchlist
    set t to item 1 of tabmatchlist
    
    set current tab of w to t
    set index of w to 1
    
end tell
 

if theTABID = 0 then
    
    
    set searchpat to "Twitter"
    ##set searchpat to "Case Management"
    tell application "Safari"
        set winlist to every window
        set winmatchlist to {}
        set tabmatchlist to {}
        set tabnamematchlist to {}
        repeat with win in winlist
            set ok to true
            try
                set tablist to every tab of win
            on error errmsg
                --display dialog name of win as string
                set ok to false
            end try
            if ok then
                repeat with t in tablist
                    if searchpat is in (name of t as string) then
                        set end of winmatchlist to win
                        set end of tabmatchlist to t
                        set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (name of t as string)
                        set theTABID to (id of win as string)
                        ##return (index of t as string)
                        --display dialog name of t as string
                    else if searchpat is in (URL of t as string) then
                        set end of winmatchlist to win
                        set end of tabmatchlist to t
                        set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (URL of t as string)
                        --display dialog name of t as string
                    end if
                end repeat
            end if
        end repeat
        
        set w to item 1 of winmatchlist
        set t to item 1 of tabmatchlist
        
        set current tab of w to t
        set index of w to 1
        
    end tell
end if

 
tell application "Safari"
    do JavaScript "document.getElementsByClassName('a8c37x1j ni8dbmo4 stjgntxs l9j0dhe7 ltmttdrg g0qnabr5 ')[0].click();" in current tab of window id theTABID
end tell

Best Answer

If you are just trying to set the value of the tab index of item 1 of t to a variable, then is there some reason you can not just use set theTabNumber to index of item 1 of t instead of set theTabNumber to item 1 of t? -- This code, set theTabNumber to index of item 1 of t returns an integer, representing the r/o index of the tab, ordered left to right in that window.

That said, looking at the code in your OP, as coded, the do JavaScript ... command is going to execute regardless of the result of both search strings, which of course doesn't make any sense!

If you are testing for multiple search strings, it is more logical to execute different do JavaScript ... commands based on the results.

That said, as an exercise (hopefully not in futility) I decided to write a handler from scratch that does the following:

  • Takes a search string.
  • Searches the name of every tab of every window for the search string.
  • If the search string is not found in the name, it searches the URL for it.
  • If the search string is found, it brings the target tab and window to the front and returns a list with the tab index and window id.
  • If the search string is not found, it returns a list with missing value for each item of the list, which can be used as the flag to execute a different search string.

For testing purposes, with multiple windows having multiple tabs with at least one set to "https://www.facebook.com" or "https://twitter.com" on different test runs of the example AppleScript code, and not logged into either, will search for "Facebook" or "Twitter" to bring their windows to the front and be the current tab to execute a do JavaScript ... command that will click the Create New Account button on Facebook or the Sign up button on Twitter.

Note: The code that brings the target window to the front and sets the target tab to the current tab can be commented out and use what's returned from the handler to target the tab by its index and the window by its id so it can be done in the background if wanted.

Example AppleScript code:

findTabContainingSearchString("Facebook")
if result does not contain missing value then
    tell application "Safari" to tell document 1 to do JavaScript ¬
        "document.getElementsByClassName('_42ft _4jy0 _6lti _4jy6 _4jy2 selected _51sy')[0].click();"
else
    findTabContainingSearchString("Twitter")
    if result does not contain missing value then
        tell application "Safari" to tell document 1 to do JavaScript ¬
            "document.getElementsByClassName('css-901oao r-1awozwy r-jwli3a r-6koalj r-18u37iz r-16y2uox r-1qd0xha r-a023e6 r-vw2c0b r-1777fci r-eljoum r-dnmrzs r-bcqeeo r-q4m81j r-qvutc0')[0].click();"
    end if
end if


on findTabContainingSearchString(searchString)
    tell application "Safari"
        set tabIndex to missing value
        set winID to missing value
        set winList to windows
        repeat with w in winList
            set tabList to (tabs of w whose name contains searchString)
            try
                set tabIndex to (get index of first item of tabList)
            end try
            if tabIndex is not missing value then
                set winID to id of w
                exit repeat
            else
                set tabList to (tabs of w whose URL contains searchString)
                try
                    set tabIndex to (get index of first item of tabList)
                end try
                if tabIndex is not missing value then
                    set winID to id of w
                    exit repeat
                end if
            end if
        end repeat
        if winID is not missing value then
            set current tab of window id winID to tab tabIndex of window id winID
            set index of window id winID to 1
        end if
        return tabIndex & winID
    end tell
end findTabContainingSearchString

Alternate Methods

If you have commented out the if winID is not missing value then block in the handler in order to execute the do JavaScript ... command in the background, change:

tell application "Safari" to tell document 1 to do JavaScript ¬

To:

set {tabIndex, winID} to result
tell application "Safari" to tell tab tabIndex of window id winID to do JavaScript ¬

Or use an even different approach:

set {tabIndex, winID} to findTabContainingSearchString("Facebook")
if {tabIndex, winID} does not contain missing value then
tell application "Safari" to tell tab tabIndex of window id winID to do JavaScript ¬