Safari AppleScript - Nie można filtrować kart nieaktywnego systemu Windows

4

Mam trochę AppleScript, który frustruje mnie. Muszę uzyskać listę wszystkich kart Safari, a następnie je odfiltrować. Spodziewałem się, że będzie to bardzo proste. To nie jest.

tell application "Safari"
    set tabSet to {}
    repeat with w in (get every window)
        repeat with t in (get every tab of w)
            set the end of tabSet to t
        end repeat
    end repeat
    --set tabSet to every tab of every window -- a one-liner here would be convenient

    set firstTab to first item of tabSet -- works, see edit
    set targetTab to first item of tabSet whose name is "Untitled" -- this fails
end tell

Po pierwsze, every tab of every window zwraca zagnieżdżoną listę list kart (pogrupowanych według okien) zamiast zwykłej listy. Właśnie skończyłem z powtórzeniami. (Jezeli tam jest sposobem na uczynienie tego jednym linerem, byłoby miło). Jak na razie, całkiem nieźle.

Wynik, z którego czerpałem first item of tabSet wyrzucał mnie, ponieważ wyglądało na to, że zwraca formę całej listy:

item 1 of {tab 1 of window id 15557 of application "Safari", tab 2 of window id 15557 of application "Safari", tab 3 of window id 15557 of application "Safari", tab 4 of...

Rzeczywisty problem występuje na linii filtrów, gdzie próbuję uzyskać first item of tabSet whose name is "Untitled". (Zastąp oczywiście prawidłową nazwą). Wtedy pojawia się ten błąd:

error "Safari got an error: Can’t get tab 1 of window id 15561 whose name = \"Untitled\". Invalid index." number -1719

EDYCJA 2:

Dodałem następujący blok:

repeat with t in tabSet
    set n to (get name of t)
    try
        set targetTab to (first item in tabSet whose name is n)
        set targetWindow to (first window whose tabs contains targetTab)
        log (get id of targetWindow) & (get name of t)
    on error
        log "ERROR: " & n
    end try
end repeat

To ujawniło, że po raz kolejny problem nie był taki, jak się wydawało, ale był w rzeczywistości czymś zupełnie innym:

Tylko karty w pierwszym oknie można filtrować. Wydaje się, że oświadczenie first item of tabSet whose name is "Untitled" kończy się niepowodzeniem, jeśli karta „Bez tytułu” znajduje się w dowolnym innym oknie niż okno znajdujące się na pierwszym planie.

Jakieś pomysły?

Whimsical Seaplane
źródło

Odpowiedzi:

1

W ten sposób AppleScript odnosi się do pozycji z list. Nie robisz nic złego.

Gdy powiesz „pierwszy element” listy, otrzymasz „element 1 z { jakaś lista } ”, Co jest dosłownie równoważne pierwszemu elementowi na liście, jakiego można oczekiwać w innych językach.

Wszystkie 3 z nich są równoważne i odnoszą się dokładnie do tego samego, nawet jeśli wyglądają inaczej.

tab 1 of window id 1
item 1 of {tab 1 of window id 1}
item 1 of {tab 1 of window id 1, tab 2 of …, …}

Możesz uzyskać właściwości z tego elementu, jakby nigdy nie był na liście.

set targetName to name of targetTab  - pobiera nazwę karty 

Może być mylące, gdy przychodzi z innych języków, aby zobaczyć całą listę, gdy chcesz tylko jeden element, ale jest prawdopodobne, że wydajność, ponieważ nie próbuje wydobyć niczego z listy, a nawet pokazać inną reprezentację tego elementu ponieważ nie chcesz widzieć reszty listy w jakimś wyjściu.

grg
źródło
Rozumiem, myślałem, że to jest problem, ponieważ nie mogłem go filtrować. Wygląda na to, że lista jest w porządku, ale whose... oświadczenie po prostu nie działa. Zmodyfikowałem to pytanie, aby to odzwierciedlić. Z jakiegoś powodu, first item of tabSet whose name is "Untitled" daje błąd. Kopię trochę więcej, aby zobaczyć, co jeszcze mogę znaleźć.
Whimsical Seaplane
@WhimsicalSeaplane first item of tabSet whose name is "…" działa idealnie dla mnie. Czy na pewno masz kartę z nazwą Bez tytułu?
grg
Tak, i spróbowałem innych i odkryłem, że działają tylko niektóre karty, a potem zacząłem widzieć wzorzec, który potwierdziłem: karty, które znajdują się w oknie, które nie jest pierwszym oknem, spowoduje ten błąd. (patrz zmiany). Teraz muszę znaleźć sposób na obejście tego.
Whimsical Seaplane