1 votes

AppleScript : recherche d'un onglet sur chrome et sauvegarde de l'onglet comme variable

J'utilise ce script qui trouve l'onglet que je veux, puis amène l'onglet au focus.

set searchString to "L'onglet que je recherche".

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

Cela fonctionne bien, mais comment puis-je enregistrer le numéro de l'onglet en tant que variable de sorte que si j'ai besoin de faire plus de choses dans cet onglet actuel, je peux simplement faire quelque chose comme ceci (en imaginant que le numéro de l'onglet est enregistré comme "TABNUMBER")

tell application "Google Chrome"
    set myTab to front window's tab TABNUMBER
    set URL of myTab to "https:..."
end tell

2voto

OnePablo Points 1

Résumé (TL;DR)

Stocker une référence à un tab o window

Soit par id (qui est fixé) :

    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/"

Ou par objet (qui est fixe) :

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

MAIS pas par index (qui change).


Vous disposez de deux options pour stocker les références à des objets (tels que les tabs ) dans AppleScript. Plus précisément, vous posez une question sur le id de l'onglet. Il faut faire attention ici : il existe des deux les modes de référencement Chrome tabs y windows en utilisant des chiffres :

Référencement Tabs / Windows par id / index

Par index : par exemple tab 2 of window 1

Il s'agit de la commandé position de l'onglet de l'extrême gauche à l'extrême droite, soit tab 1 fait référence à la left tab , tab 2 fait référence à l'onglet à droite de tab 1 etc.

Ces indices changement si les onglets se déplacent, s'ouvrent et se ferment. Par exemple, si vous fermez le milieu de trois onglets, tab 3 devient alors tab 2 .

Avec le windows la collection index est le commandé position de la fenêtre, de l'avant à l'arrière, ordonnée selon la fenêtre qui a reçu le focus le plus récemment. window 1 est synonyme de front window et se concentre actuellement. Lorsque vous passez à une autre Chrome cela devient maintenant window 1 et le précédent window 1 est maintenant window 2 .

Par conséquent, le référencement d'un objet et le stockage des références à cet objet par son index est une méthode très peu fiable, à l'exception des références à la propriété front window o front tab où seul compte l'objet qui a actuellement le focus, quel qu'il soit. Par conséquent, tell the front tab of the front window to... est une utilisation parfaitement raisonnable de la index et probablement le seul.

Notez, que le index est une propriété nommée pour window des objets, qui peuvent être lus et set (le régler sur 1 pour le mettre en avant). Bien que tab les objets sont désignés par un index il ne s'agit pas d'une propriété nommée que l'on peut lire ou définir.

Par id : par exemple tab id 54 of window id 53

Il s'agit d'un unique , Correction de propriété attribuée à chaque objet au moment de sa création, et sa valeur augmente généralement au fur et à mesure que l'on crée de nouveaux objets dans une famille d'objets similaires. Donc, en général , window id 2088 a été créé après window id 25 .

Il est important de noter que le id fournit une valeur de référence fixe avec laquelle vous pouvez stocker de manière fiable et sûre des objets dans des variables pour une utilisation ultérieure, en sachant qu'ils feront toujours référence à l'exact même objet, quel que soit l'endroit de votre script où la variable est évaluée et comment la disposition des objets a changé (jusqu'à ce que l'objet soit détruit).

Définition et obtention de la variable

Lorsque vous souhaitez attribuer une référence à un tab ou un window à une variable, vous pouvez choisir de :

soit de stocker son id puis faire référence à la valeur de la propriété tab par son id plus tard, dont la valeur sera celle de la variable ;

ou vous pouvez stocker l'objet entier lui-même dans une variable AppleScript. C'est souvent le plus simple.

Par id

A magasin par id vous pouvez le faire comme ceci :

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

Sur Chrome le active tab of the front window pourrait revenir tab id 34 of window id 2045 . Le site id de ce tab L'objet est 34 donc T se voit attribuer la valeur 34 .

Puis, plus tard, pour effectuer des actions sur ce même onglet, qui n'est peut-être plus le active tab vous pouvez le faire comme ceci :

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

(en supposant que le front window est toujours window id 2045 ; sinon, vous devrez stocker l'élément window id dans une valeur séparée également).

Notez que la référence est à un tab id T y pas tab T qui serait tab 34 (c'est-à-dire index 34, si vous aviez 34 onglets ouverts). Le site id étiquette doit être inclus.

Par objet

Pour enregistrer le tab l'objet lui-même, ce qui est souvent préférable, vous le faites comme ceci :

    set T to the front tab of the front window

Bien que j'aie implicitement utilisé index ici, AppleScript fait en fait référence à la tab et le window à la fois par leur id (ce qu'il fait dans presque toutes les situations). Ainsi, si vous évaluez T vous y trouverez tab id 34 of window id 2045 et non tab 1 of window 1 .

Vous pouvez également attribuer le tab à une variable comme ceci :

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

et T contiendra tab id 30 of window id 2045 que l'on peut ensuite appeler pour effectuer des actions à l'intérieur/à l'extérieur :

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

ou

    tell T to close

0 votes

C'est parfait merci, je suis hors du bureau pour quelques jours mais j'ai hâte de tester tout ça. merci.

1voto

OnePablo Points 1

Notes sur le script

Je soumets cette deuxième "réponse" afin d'aborder certains points spécifiques de l'échantillon de code que vous avez fourni dans votre message. Comme cela ne répond pas directement à votre question (ce que fait ma première réponse), et parce que ma première réponse est déjà très longue, il m'a semblé judicieux de la composer séparément.

Pour commencer, votre on setActiveTabIndex(t, searchString) La définition du gestionnaire spécifie un argument t mais n'utilise la variable nulle part dans le gestionnaire. La variable t que est utilisé provient en fait de la repeat with t in tabs of front window boucle, où t se voit attribuer séquentiellement la référence à chaque tab de la front window . Par conséquent, vous pouvez simplement changer la déclaration du gestionnaire en on setActiveTabIndex(searchString) et ensuite ajuster le reste du script en conséquence partout où le gestionnaire est appelé, c'est-à-dire en supprimant le premier argument.

Il y a une bizarrerie dans la façon dont vous avez implémenté les repeat dans ce gestionnaire est la façon dont vous avez déclaré une nouvelle variable i pour servir de compteur, puis incrémenter manuellement sa valeur à chaque itération. Au lieu de cela, vous pouvez définir i au sein de la repeat la construction elle-même, comme ceci :

    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

Le reste de la script est ok mais elle repose sur un grand nombre de boucles itératives manuelles qui sont non seulement difficiles à lire dans le script - rendant difficile de discerner ce qui se passe à chaque étape - mais elle est également moins efficace en termes d'exécution.

Au lieu de cela, vous pouvez utiliser Les collections d'objets d'AppleScript qui peuvent être filtré en utilisant whose (ou where ).

Par exemple, au lieu de :

    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

vous pouvez utiliser ceci :

    get every tab in every window whose title contains the searchString

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X