user3734555
user3734555

Reputation: 1

Scripting Safari to open 10 URLs and then rotate through through then about every 15 seconds

I need to be able to open roughly 10 URLs in Safari and then rotate through them, pausing on each for about 15 seconds. I'd also like the Safari window to be maximized.

I tried this with a simple Javascript, but it causes the windows to refresh every time and that's distracting. So, I think AppleScript with Safari would be a "cleaner" approach

Here's what I've started with:

tell application "Safari"
activate
tell window 1
    make new tab with properties {URL:"http://news.yahoo.com"}
    make new tab with properties {URL:"http://news.google.com"}
    make new tab with properties {URL:"http://www.macintouch.com"}
    set current tab to tab 1
    set numTabs to number of tabs
end tell
activate
tell window 1
    repeat with j from 1 to (count of tabs of window 1) by 1
        set current tab to j
        activate
        delay 5
    end repeat
end tell

end tell

Upvotes: 0

Views: 401

Answers (2)

CJK
CJK

Reputation: 6112

I've taken a slightly different approach to @wch1zpink. In the script below, you can edit and add to the property URLs, which will define what tabs to open whilst keeping them collected at the top of the script and separate from the main body of the code. You can supply nonsense URLs if you wish, as these are dealt with gracefully by the script.

I've also elected to maximise the window rather than go fullscreen, but if you prefer fullscreen, then this is easily done and I've included a snippet at the end to demonstrate a clean way to achieve this.

property URLs : {"https://google.com", ¬
    "https://dropbox.com", ¬
    "https://imdb.com", ¬
    "https://bbc.co.uk", ¬
    "foobar blah blah", ¬
    "https://disney.com"}

property errorPage : "safari-resource:/ErrorPage.html"
property time : 15 -- time (seconds) between tab switches

tell application "System Events" to set screenSize to ¬
    the size of scroll area 1 of process "Finder"

tell application "Safari"
    make new document with properties {URL:the first item in the URLs}
    tell the front window
        set W to it

        repeat with URL in the rest of the URLs
            make new tab with properties {URL:URL}
        end repeat

        set the bounds to {0, 0} & the screenSize
        activate

        tell (a reference to the current tab) to repeat
            delay my time

            if not (W exists) then return
            set N to the number of tabs in W
            try
                set contents to tab (index mod N + 1) in W
            end try
            if its URL = errorPage then close
        end repeat
    end tell
end tell

The other property you can set is time, which defines how long (in seconds) to pause on each tab, presently set to 15 seconds. The tabs rotate in turn, but do so on a continuous loop until you close the window. Any tabs with nonsense URLs are immediately closed just before coming into focus, so the transition to the next sensible tab is actually seamless and you won't notice the closures.

You can still open new tabs as you please (within the 15-second window), and you can switch to whichever tab you desire manually. The progression will continue from whichever tab you select acting as the new starting point.

Fullscreen

Currently, the script sets the size of the window to the maximum area available on your screen which, in modern versions of macOS, should take into account the menu bar and dock without obscuring them.

If you prefer a fullscreen mode, then you would replace this line:

set the bounds to {0, 0} & the screenSize

with this:

tell application "System Events" to set value of attribute ¬
    "AXFullScreen" of front window of process "Safari" to true

Strictly speaking, you ought to try and sit this line outside of the tell application "Safari" block, by splitting the Safari block into two; coming out of the first block to enact the fullscreen mode; then re-entering the second block. But Safari won't die if you don't do this, so a simple cut-and-paste that exchanges one line for the other will suffice, as long as you appreciate that this would be considered lazy and poor form.

Upvotes: 1

wch1zpink
wch1zpink

Reputation: 3142

This AppleScript code works for me using the latest version of macOS Mojave.

Be sure to fill in the remaining 7 URL's. I think this following code achieves what you are looking for.

tell application "Safari"
    activate
    if not (exists of window 1) then make new document
    tell window 1
        set startingTabForRotating to make new tab with properties {URL:"http://news.yahoo.com"} -- URL 1
        make new tab with properties {URL:"http://news.google.com"} -- URL 2
        --make new tab with properties {URL:"something.com"}
        --make new tab with properties {URL:"something.com"}
        --make new tab with properties {URL:"something.com"}
        --make new tab with properties {URL:"something.com"}
        --make new tab with properties {URL:"something.com"}
        --make new tab with properties {URL:"something.com"}
        --make new tab with properties {URL:"something.com"}
        set endingTabForRotating to make new tab with properties {URL:"http://www.macintouch.com"} -- URL 10

        set current tab to startingTabForRotating

        delay 1
        tell application "System Events"
            if exists of UI element 3 of window 1 of application process "Safari" then
                click UI element 3 of window 1 of application process "Safari" -- Maximizes Safari
            end if
        end tell

        repeat until current tab is endingTabForRotating
            delay 15
            set current tab to tab ((index of current tab) + 1)
        end repeat
    end tell
end tell

Upvotes: 1

Related Questions