AppleScript : Suche nach einem Tab auf Chrome und Speichern des Tabs als Variable

Ich verwende dieses Skript, das die gewünschte Registerkarte findet und dann die Registerkarte fokussiert.

setze searchString auf "Tab ich suche"

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

Das funktioniert gut, aber wie kann ich die Tab-Nummer als Variable speichern, also wenn ich mehr Dinge in diesem eigentlichen Tab tun muss, kann ich einfach so etwas tun (stellen Sie sich vor, die Tab-Nummer wird als "TABNUMBER" gespeichert)

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

Antworten (2)

Anmerkungen zum Drehbuch

Ich sende diese zweite "Antwort", um einige Besonderheiten des Codebeispiels anzusprechen, das Sie in Ihrem Beitrag bereitgestellt haben. Da dies Ihre Frage nicht direkt beantwortet (was meine erste Antwort tut) und weil meine erste Antwort bereits sehr lang ist; Ich hielt es für sinnvoll, dies separat zu komponieren.

Zu Beginn gibt Ihre on setActiveTabIndex(t, searchString)Handler-Definition ein Argument an t, verwendet die Variable dann aber nirgendwo im Handler. Die verwendete Variable tkommt tatsächlich aus der Schleife, wo nacheinander die Referenz jedem der zugewiesen wird . Daher können Sie die Handler-Deklaration einfach in ändern und dann den Rest des Skripts entsprechend anpassen, wo immer der Handler aufgerufen wird, dh indem Sie das erste Argument entfernen.repeat with t in tabs of front windowttabfront windowon setActiveTabIndex(searchString)

Eine Kuriosität in der Art und Weise, wie Sie die repeatSchleife in diesem Handler implementiert haben, ist, wie Sie eine neue Variable deklariert haben, die ials Zähler dient, und dann ihren Wert bei jeder Iteration manuell erhöht haben. Stattdessen können Sie iinnerhalb des repeatKonstrukts selbst wie folgt definieren:

    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

Der Rest des Skripts ist in Ordnung , aber es basiert auf vielen manuellen iterativen Schleifen, die nicht nur im Skript schwer zu lesen sind – was es schwierig macht, zu erkennen, was in jeder Phase passiert –, sondern auch weniger effizient in der Ausführung.

Stattdessen könnten Sie die Objektsammlungen von AppleScript verwenden, die mit (oder ) gefiltert werden können .whosewhere

Statt z.B.:

    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

Sie können dies verwenden:

    get every tab in every window whose title contains the searchString

Zusammenfassung (TL;DR)

Speichern Sie eine Referenz auf ein taboderwindow

Entweder durch id(was feststeht):

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

Oder nach Objekt (das fest ist):

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

ABER nicht durch index(was sich ändert).


Beim Speichern von Referenzen auf Objekte (z. B. ) in AppleScript stehen Ihnen mehrere Optionen zur Verfügung tabs. Insbesondere fragen Sie nach der idEigenschaft der Registerkarte. Hier müssen Sie aufpassen: Es gibt zwei Möglichkeiten, auf Chrome tabs zu verweisen und windowsZahlen zu verwenden:

Referenzierung Tabs/ Windowsdurch id/index

❶・Durch index: zBtab 2 of window 1

Dies bezieht sich auf die geordnete Position des Tabulators von ganz links nach ganz rechts, dh tab 1bezieht sich auf den left tab, tab 2bezieht sich auf den Tabulator rechts von tab 1, etc..

Diese Indizes ändern sich, wenn sich Tabs bewegen, öffnen und schließen. Wenn Sie beispielsweise die mittlere von drei Registerkarten schließen, tab 3wird dann zu tab 2.

Bei der windowsSammlung indexist das die geordnete Position des Fensters vom vordersten zum hintersten, geordnet danach, welches Fenster zuletzt den Fokus erhalten hat. window 1ist gleichbedeutend mit der front window, und hat derzeit den Fokus. Wenn Sie zu einem anderen Chrome- Fenster wechseln, wird dies jetzt zu window 1und das vorherige window 1ist jetzt window 2.

Daher indexist das Verweisen auf ein Objekt und das Speichern von Verweisen auf dieses Objekt durch seine Eigenschaft eine sehr unzuverlässige Methode, mit Ausnahme von Verweisen auf oder, front windowbei front tabdenen es nur darauf ankommt, dass das Objekt derzeit den Fokus hat, unabhängig davon, um welches es sich handelt. Daher tell the front tab of the front window to...ist die Verwendung der index, und wahrscheinlich die einzige, vollkommen sinnvoll.

Beachten Sie, dass die indexEigenschaft eine benannte Eigenschaft für Objekte ist , die gelesen und gesetzt windowwerden kann (setzen Sie sie auf , um sie in den Vordergrund zu bringen). Obwohl auf Objekte durch eine Eigenschaft verwiesen wird , handelt es sich nicht um eine benannte Eigenschaft, die man lesen oder festlegen kann.1tabindex

❷・Durch id: zBtab id 54 of window id 53

Dies ist eine einzigartige , feste Eigenschaft, die jedem Objekt zum Zeitpunkt seiner Erstellung zugewiesen wird und deren Wert typischerweise steigt, wenn jedes neue Objekt in einer Familie ähnlicher Objekte erstellt wird. Also wurde im Allgemeinenwindow id 2088 nach erstellt window id 25.

Wichtig ist, dass das ideinen festen Referenzwert bietet, mit dem Sie Objekte für die spätere Verwendung zuverlässig und sicher in Variablen speichern können, in dem Wissen, dass sie immer noch auf genau dasselbe Objekt verweisen, unabhängig davon, wo in Ihrem Skript die Variable ausgewertet wird und wie die Anordnung der Objekte geändert hat (bis das Objekt zerstört wird).

Setzen und Abrufen der Variablen

tabWenn Sie a eine Referenz oder windoweiner Variablen zuweisen möchten , haben Sie folgende Möglichkeiten:

Speichern Sie entweder seinen tatsächlichen idEigenschaftswert und referenzieren Sie ihn tabspäter id, dessen Wert der Wert der Variablen ist.

oder Sie können das gesamte Objekt selbst in einer AppleScript-Variablen speichern. Das ist oft am einfachsten.

Vonid

Um nach zu speichernid , können Sie dies wie folgt tun:

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

In Chrome könnte das active tab of the front windowzurückkehren tab id 34 of window id 2045. Das idvon diesem tabObjekt ist 34, Tbekommt also den Wert zugewiesen 34.

Um später Aktionen auf derselben Registerkarte auszuführen, die möglicherweise nicht mehr die ist active tab, können Sie dies folgendermaßen tun:

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

(vorausgesetzt, das front windowist immer noch window id 2045; andernfalls müssen Sie den window idWert auch in einem separaten Wert speichern.)

Beachten Sie, dass der Verweis auf atab id T und nicht auf tab T , was wäre tab 34(dh index34, wenn Sie 34 Tabs geöffnet hätten). Das idEtikett muss dabei sein.

Nach Objekt

Um das tabObjekt selbst zu speichern, was oft vorzuziehen ist, gehen Sie folgendermaßen vor:

    set T to the front tab of the front window

Obwohl ich hier implizit indexWerte verwendet habe, referenziert AppleScript tatsächlich die tabund die windowbeide durch ihre idWerte (was in fast allen Situationen der Fall ist). Wenn Sie also auswerten T, werden Sie feststellen, dass es enthält tab id 34 of window id 2045und nicht tab 1 of window 1.

Sie können das tabObjekt auch wie folgt einer Variablen zuweisen:

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

und Tenthält tab id 30 of window id 2045, auf das Sie später zugreifen können, um Aktionen innerhalb von/auf auszuführen:

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

oder

    tell T to close
Das ist perfekt, danke, ich bin für ein paar Tage nicht im Büro, kann es aber kaum erwarten, das alles zu testen. Danke.