AppleScript: ricerca di una scheda su Chrome e salvataggio della scheda come variabile

1

Sto usando questo script che sta trovando la scheda che desidero, quindi lo metto a fuoco sulla scheda.

imposta searchString su "Tab I'm Looking FOR"

tell application "Google Chrome"
    set win_List to every window
    set win_MatchList to {}
    set tab_MatchList to {}
    set tab_NameMatchList to {}
    repeat with win in win_List
        set tab_list to every tab of win
        repeat with t in tab_list
            if searchString is in (title of t as string) then
                set end of win_MatchList to win
                set end of tab_MatchList to t
                set end of tab_NameMatchList to (id of win as string) & ".  " & (title of t as string)
            end if
        end repeat
    end repeat
    if (count of tab_MatchList) is equal to 1 then
        set w to item 1 of win_MatchList
        set index of w to 1
        my setActiveTabIndex(t, searchString)
    else if (count of tab_MatchList) is equal to 0 then
        display dialog "No match was found!" buttons {"OK"} default button 1
    else
        set which_Tab to choose from list of tab_NameMatchList with prompt "The following Tabs matched, please select one:"
        set AppleScript's text item delimiters to "."
        if which_Tab is not equal to false then
            set tmp to text items of (which_Tab as string)
            set w to (item 1 of tmp) as integer
            set index of window id w to 1
            my setActiveTabIndex(t, searchString)
        end if
    end if
end tell
on setActiveTabIndex(t, searchString)
    tell application "Google Chrome"
        set i to 0
        repeat with t in tabs of front window
            set i to i + 1
            if title of t contains searchString then
                set active tab index of front window to i
                return
            end if
        end repeat
    end tell

end setActiveTabIndex

Questo funziona bene, ma come posso salvare il numero di tabulazione come variabile, quindi se ho bisogno di fare più cose in questa scheda effettiva posso semplicemente fare qualcosa di simile (immaginando che il numero di tabulazione sia stato salvato come "TABNUMBER")

tell application "Google Chrome"
    set myTab to front window's tab TABNUMBER
    set URL of myTab to "https:..."
end tell
    
posta Kevin 24.06.2018 - 16:26
fonte

2 risposte

1

Note sullo script

Sto inviando questa seconda "risposta" per rispondere ad alcune specifiche sull'esempio di codice che hai fornito nel tuo post. Poiché questo non risponde direttamente alla tua domanda (quale è la mia prima risposta), e perché la mia prima risposta è già molto lunga; Ho ritenuto opportuno comporre questo separatamente.

Per iniziare, la definizione del gestore on setActiveTabIndex(t, searchString) specifica un argomento t , ma in questo caso non fa uso della variabile in nessun punto del gestore. La variabile t che è utilizzata proviene effettivamente dal ciclo repeat with t in tabs of front window , dove t è assegnato sequenzialmente il riferimento a ogni tab di front window . Pertanto, puoi semplicemente modificare la dichiarazione del gestore su on setActiveTabIndex(searchString) , quindi regolare il resto dello script di conseguenza ovunque venga chiamato il gestore, ovvero rimuovendo il primo argomento.

Una stranezza nel modo in cui hai implementato il ciclo repeat in questo gestore è il modo in cui hai dichiarato una nuova variabile i da utilizzare come contatore, quindi incrementale manualmente il valore con ogni iterazione. Invece, puoi definire i all'interno del costrutto repeat , in questo modo:

    repeat with i from 1 to the number of tabs in the front window
        set t to tab i of the front window
        if title of t contains the searchString then
            set the active tab index of the front window to i
            return
        end if
    end repeat

Il resto dello script è okay , ma si basa su molti loop iterativi manuali che non solo sono difficili da leggere all'interno dello script, rendendo difficile discernere cosa sta succedendo in ogni fase- ma è anche meno efficiente in esecuzione.

Potresti invece utilizzare raccolte di oggetti di AppleScript che possono essere filtrate utilizzando whose (o where ).

Ad esempio, invece di:

    repeat with win in win_List
        ...
        repeat with T in tab_list
            if searchString is in (title of T as string) then
                ...
            end if
            ...
        end repeat
    end repeat

puoi usare questo:

    get every tab in every window whose title contains the searchString
    
risposta data 24.06.2018 - 20:35
fonte
1

Riepilogo (TL; DR)

Memorizza un riferimento a tab o window

O di id (che è corretto):

    set T to the id of the current tab in the front window
    ...
    set the URL of tab id T of the front window to "https://apple.stackexchange.com/"

O per oggetto (che è corretto):

    set T to the current tab in the front window
    ...
    set the URL of T to "https://apple.stackexchange.com/"

MA non da index (che cambia).

Hai un paio di opzioni quando memorizzi riferimenti ad oggetti (come tabs ) in AppleScript. Nello specifico, stai chiedendo la proprietà id della scheda. Devi essere attento qui: ci sono due modi di referenziare Chrome tabs e windows usando i numeri:

Riferimento a Tabs / Windows da id / index

❶・By index: e.g. tab 2 of window 1

Questo si riferisce alla posizione ordinata della scheda da sinistra a destra, ovvero tab 1 si riferisce a left tab , tab 2 si riferisce a tab a destra di tab 1 , ecc ..

Questi indici cambiano se le schede si spostano, si aprono e si chiudono. Ad esempio, se chiudi la metà di tre schede, tab 3 diventa tab 2 .

Con la raccolta windows , la index è la posizione ordinata della finestra dalla prima all'ultima estremità, ordinata da quale finestra ha ricevuto il focus più recente. window 1 è sinonimo di front window e attualmente ha lo stato attivo. Quando passi a un'altra finestra Chrome , questa diventa window 1 e la precedente window 1 ora è window 2 .

Pertanto, fare riferimento a un oggetto e archiviare riferimenti a tale oggetto con la sua proprietà index è un metodo molto inaffidabile, con l'eccezione dei riferimenti a front window o front tab in cui è importante che l'oggetto sia attualmente attivo , indipendentemente da quale sia. Pertanto, tell the front tab of the front window to... è un uso perfettamente ragionevole del index , e probabilmente l'unico.

Si noti che la proprietà index è una proprietà denominata per gli oggetti window , che può essere letta e impostata (impostarla su 1 per portarla in primo piano). Sebbene gli oggetti tab vengano indicati da una proprietà index , non è una proprietà denominata che è possibile leggere o impostare.

❷・By id: e.g. tab id 54 of window id 53

Questa è una proprietà unica , fissa assegnata a ciascun oggetto al momento della sua creazione, e tipicamente sale di valore come ogni nuovo oggetto in una famiglia di simili gli oggetti sono creati. Quindi, in generale , window id 2088 è stato creato dopo window id 25 .

È importante sottolineare che id fornisce un valore di riferimento fisso con il quale è possibile archiviare in modo affidabile e sicuro gli oggetti nelle variabili per un uso futuro, sapendo che si riferiranno ancora allo stesso oggetto esatto indipendentemente da dove nel tuo script viene valutata la variabile e come è cambiata la disposizione degli oggetti (fino a quando l'oggetto non viene distrutto).

Impostazione e recupero della variabile

Quando desideri assegnare un riferimento a tab o a window a una variabile, puoi scegliere di:

o memorizza il suo valore di proprietà id effettivo, quindi fa riferimento a tab con id in seguito, il cui valore sarà il valore della variabile;

o puoi memorizzare l'intero oggetto stesso in una variabile AppleScript. Questo è spesso il più semplice.

di id

Per memorizzare per id , puoi farlo in questo modo:

    set T to the id of the active tab of the front window

In Chrome , active tab of the front window potrebbe restituire tab id 34 of window id 2045 . Il id di quell'oggetto tab è 34 , quindi T viene assegnato il valore 34 .

Successivamente, per eseguire azioni su quella stessa scheda, che potrebbe non essere più active tab , puoi farlo in questo modo:

    tell tab id T of the front window to execute JavaScript...

(assumendo che front window sia ancora window id 2045 , altrimenti dovrai memorizzare il valore window id anche in un valore separato).

Tieni presente che il riferimento è a tab id T e non tab T , che sarebbe tab 34 (cioè index 34, se hai aperto 34 schede). L'etichetta id deve essere inclusa.

Per oggetto

Per memorizzare l'oggetto tab stesso, che è spesso preferibile, lo fai in questo modo:

    set T to the front tab of the front window

Anche se qui ho utilizzato implicitamente valori di index , AppleScript in realtà fa riferimento a tab e window entrambi con i loro valori di id (che lo fa in quasi tutte le situazioni). Quindi se valuti T , troverai che contiene tab id 34 of window id 2045 e non tab 1 of window 1 .

Puoi anche assegnare l'oggetto tab a una variabile come questa:

    set T to the first tab of window id 2045 whose URL is "chrome://newtab/"

e T conterrà tab id 30 of window id 2045 , che puoi chiamare in seguito per eseguire azioni all'interno / su:

    set the URL of T to "https://stackexchange.com"

o

    tell T to close
    
risposta data 24.06.2018 - 19:22
fonte

Leggi altre domande sui tag