AppleScript: поиск вкладки в Chrome и сохранение вкладки в качестве переменной

1

Я использую этот скрипт, который находит вкладку, которую я хочу, а затем перенести вкладку в фокус.

установите для searchString значение «Tab, который я ищу»

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

Это прекрасно работает, но как я могу сохранить номер вкладки как переменную, чтобы, если мне нужно было сделать больше вещей на этой фактической вкладке, я могу просто сделать что-то вроде этого (представив, что номер вкладки сохраняется как «TABNUMBER»)

tell application "Google Chrome"
    set myTab to front window's tab TABNUMBER
    set URL of myTab to "https:..."
end tell
Kevin
источник

Ответы:

1

Примечания к сценарию

Я отправляю второй «ответ», чтобы рассмотреть некоторые особенности кода, который вы предоставили в своем посте. Поскольку это не дает прямого ответа на ваш вопрос (что делает мой первый ответ), и потому что мой первый ответ уже очень длинный; Я счел разумным составить это отдельно.

Для начала ваш on setActiveTabIndex(t, searchString) определение обработчика определяет аргумент t, но затем не использует переменную где-либо в обработчике. Переменная t тот является используется на самом деле происходит от repeat with t in tabs of front window петля, где t последовательно присваивается ссылка каждому tab из front window, Поэтому вы можете просто изменить объявление обработчика на on setActiveTabIndex(searchString)и затем корректируйте оставшуюся часть сценария соответственно, где бы ни вызывался обработчик, т.е. удаляя первый аргумент.

Одна странность в том, как вы реализовали repeat Цикл в этом обработчике, как вы объявили новую переменную i в качестве счетчика, затем вручную увеличивайте его значение с каждой итерацией. Вместо этого вы можете определить i в пределах repeat построить себя так:

    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

Остальная часть сценария Хорошо , но он опирается на множество ручных итеративных циклов, которые не только трудно прочитать в скрипте, что затрудняет распознавание того, что происходит на каждом этапе, но и менее эффективны при выполнении.

Вместо этого вы можете использовать Коллекции объектов AppleScript это может быть отфильтрованный с помощью whose (или же where ).

Например, вместо:

    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

Вы можете использовать это:

    get every tab in every window whose title contains the searchString
CJK
источник
1

Резюме (TL; DR)

Сохранить ссылку на tab или же window

Или от id (что исправлено):

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

Или же по объекту (который фиксирован):

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

НО не index (что меняется).


У вас есть несколько вариантов хранения ссылок на объекты (например, tabs ) в AppleScript. В частности, вы спрашиваете о id свойство вкладки. Вы должны быть внимательны здесь: есть два способы ссылки Хром tabs а также windows используя номера:

привязка Tabs / Windows от id / index

❶ · По indexНапример, tab 2 of window 1

Это относится к приказал положение вкладки слева направо, т.е. tab 1 относится к left tab, tab 2 относится к вкладке справа от tab 1, так далее..

Эти показатели менять если вкладки перемещаются, открывайте и закрывайте. Например, если вы закроете середину трех вкладок, tab 3 затем становится tab 2,

С windows коллекция, index это приказал положение окна от переднего к последнему, упорядоченное по тому, какое окно получило фокус в последний раз. window 1 является синонимом front windowи в настоящее время имеет фокус. Когда вы переключаетесь на другой Хром окно, это теперь становится window 1и предыдущий window 1 сейчас window 2,

Следовательно, ссылка на объект и сохранение ссылок на этот объект его index свойство является очень ненадежным методом, за исключением ссылок на front window или же front tab где имеет значение только то, что объект в настоящее время имеет фокус, независимо от того, какой он есть. Следовательно, tell the front tab of the front window to... вполне разумное использование indexи, вероятно, единственный.

Обратите внимание, что index свойство является именованным свойством для window объекты, которые можно прочитать а также установить (установить его на 1 вывести его на фронт). Хотя tab объекты действительно упоминаются index свойство, это не именованное свойство, которое можно прочитать или установить.

❷ · По idНапример, tab id 54 of window id 53

Это уникальный , фиксированный свойство, назначаемое каждому объекту в момент его создания, и оно обычно возрастает в стоимости по мере создания каждого нового объекта в семействе похожих объектов. Так, вообще говоря , window id 2088 был создан после window id 25,

Важно отметить, что id предоставляет фиксированное эталонное значение, с помощью которого вы можете надежно и безопасно хранить объекты в переменных для последующего использования, зная, что они по-прежнему будут ссылаться на один и тот же объект независимо от того, где в вашем скрипте оценивается переменная и как изменилось расположение объектов ( пока объект не разрушен).

Установка и получение переменной

Когда вы хотите назначить ссылку на tab или window к переменной, вы можете выбрать:

или сохранить его актуальным id значение свойства, затем ссылка на tab своим id позже значение которого будет значением переменной;

или же Вы можете сохранить весь объект целиком в переменной AppleScript. Это часто самый простой.

От id

к хранить в id, вы можете сделать это так:

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

В Хром , active tab of the front window может вернуться tab id 34 of window id 2045, id того, что tab объект 34, так T получает назначенное значение 34,

Затем, чтобы выполнить действия на той же вкладке, которая больше не может быть active tab, вы можете сделать это так:

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

(при условии front window все еще window id 2045; в противном случае вам придется хранить window id значение в отдельном значении тоже.)

Обратите внимание, что ссылка на tab id T а также не tab T, который был бы tab 34 (Т.е. index 34, если у вас было открыто 34 вкладки). id этикетка должен быть включенным

По объекту

Для хранения tab Сам объект, который часто предпочтительнее, вы делаете так:

    set T to the front tab of the front window

Хотя я неявно использовал index значения здесь, AppleScript на самом деле ссылается на tab и window оба их id значения (что он делает это почти во всех ситуациях). Так что, если вы оцениваете Tвы найдете в нем содержится tab id 34 of window id 2045 и не tab 1 of window 1,

Вы также можете назначить tab Объект для переменной, как это:

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

а также T будет содержать tab id 30 of window id 2045, который вы позже можете использовать для выполнения действий в / после:

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

или же

    tell T to close
CJK
источник
это прекрасно, спасибо, я нахожусь в офисе на несколько дней, но не могу дождаться, чтобы проверить все это. благодарю вас.
Kevin