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
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 t
kommt 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 window
t
tab
front window
on setActiveTabIndex(searchString)
Eine Kuriosität in der Art und Weise, wie Sie die repeat
Schleife in diesem Handler implementiert haben, ist, wie Sie eine neue Variable deklariert haben, die i
als Zähler dient, und dann ihren Wert bei jeder Iteration manuell erhöht haben. Stattdessen können Sie i
innerhalb des repeat
Konstrukts 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 .whose
where
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
Speichern Sie eine Referenz auf ein tab
oderwindow
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 id
Eigenschaft der Registerkarte. Hier müssen Sie aufpassen: Es gibt zwei Möglichkeiten, auf Chrome tabs
zu verweisen und windows
Zahlen zu verwenden:
Tabs
/ Windows
durch 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 1
bezieht sich auf den left tab
, tab 2
bezieht 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 3
wird dann zu tab 2
.
Bei der windows
Sammlung index
ist das die geordnete Position des Fensters vom vordersten zum hintersten, geordnet danach, welches Fenster zuletzt den Fokus erhalten hat. window 1
ist gleichbedeutend mit der front window
, und hat derzeit den Fokus. Wenn Sie zu einem anderen Chrome- Fenster wechseln, wird dies jetzt zu window 1
und das vorherige window 1
ist jetzt window 2
.
Daher index
ist 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 window
bei front tab
denen 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 index
Eigenschaft eine benannte Eigenschaft für Objekte ist , die gelesen und gesetzt window
werden 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.1
tab
index
❷・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 id
einen 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).
tab
Wenn Sie a eine Referenz oder window
einer Variablen zuweisen möchten , haben Sie folgende Möglichkeiten:
Speichern Sie entweder seinen tatsächlichen id
Eigenschaftswert und referenzieren Sie ihn tab
spä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.
id
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 window
zurückkehren tab id 34 of window id 2045
. Das id
von diesem tab
Objekt ist 34
, T
bekommt 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 window
ist immer noch window id 2045
; andernfalls müssen Sie den window id
Wert 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 index
34, wenn Sie 34 Tabs geöffnet hätten). Das id
Etikett muss dabei sein.
Um das tab
Objekt 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 index
Werte verwendet habe, referenziert AppleScript tatsächlich die tab
und die window
beide durch ihre id
Werte (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 2045
und nicht tab 1 of window 1
.
Sie können das tab
Objekt auch wie folgt einer Variablen zuweisen:
set T to the first tab of window id 2045 whose URL is "chrome://newtab/"
und T
enthä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
Kevin