Хобрук: Ваш путь к мастерству в программировании

Как взаимодействовать с элементами управления на панели с помощью Javascript для автоматизации (Yosemite)

Я пытаюсь преобразовать старый Applescript в Javascript. Цель сценария — включать и выключать общий доступ к Интернету. Мне удалось открыть панель «Общий доступ» и найти якорь «Общий доступ в Интернет», но я не могу понять, как взаимодействовать с элементами управления на панели. В Applescript у меня были системные события, которые сообщали Системным настройкам, чтобы установить определенный флажок, но все, что я пробовал до этого момента с Javascript, возвращало тупые ошибки.

Вот что я получил до сих пор:

prefs = Application('System Preferences')

sharePane = prefs.panes.byName('Sharing')

anchors = sharePane.anchors()

netAnchor = ""

for (i in anchors) {
    if (anchors[i].name().search('net') > -1) {
        netAnchor = anchors[i]
    }
}

Ответы:


1

Ну вот.

prefs = Application("System Preferences");
prefs.activate();
prefs.panes.byName("Sharing").reveal();

SystemEvents = Application("System Events");
procPref = SystemEvents.processes["System Preferences"];

// option 1: fixed row number
procPref.windows[0].groups[0].scrollAreas[0].tables[0].rows[6].checkboxes[0].click();

Или, если вы предпочитаете решение, которое не зависит от знания точного номера строки:

prefs = Application("System Preferences");
prefs.activate();
prefs.panes.byName("Sharing").anchors.byName("Internet").reveal(); // achor needed for option #3

SystemEvents = Application("System Events");
procPref = SystemEvents.processes["System Preferences"];

// option 2: select row by label
procPref.windows[0].groups[0].scrollAreas[0].tables[0].rows().forEach(function(r) {
  if (r.staticTexts[0].name() === "Internet Sharing") r.checkboxes[0].click();
});

// option 3: let reveal select the correct row, then press space to toggle
procPref.windows[0].groups[0].scrollAreas[0].focused = true;
delay(1); // give it some time to get the window activated before pressing space
SystemEvents.keystroke(" ");

Обновление: добавлены опции № 2 и № 3 и детали списка.

Вот список якорей на выбор:

/* Internet */
/* Services_PrinterSharing */
/* Services_ARDService */
/* Services_RemoteAppleEvent */
/* Services_BluetoothSharing */
/* Main */
/* Services_DVDorCDSharing */
/* Services_RemoteLogin */
/* Services_ScreenSharing */
/* Services_WindowsSharing */
/* Services_PersonalFileSharing */

И список строк (в Yosemite 10.10), показывающий номер строки и метку (на английском языке):

/* 0: Screen Sharing */
/* 1: File Sharing */
/* 2: Printer Sharing */
/* 3: Remote Login */
/* 4: Remote Management */
/* 5: Remote Apple Events */
/* 6: Internet Sharing */
/* 7: Bluetooth Sharing */
12.11.2014

2

В итоге я остановился на GUI Scripting, потому что по какой-то причине мне это показалось проще. Я публикую свой сценарий ниже, но это полный сценарий. Однако приведенное выше выполняет то, о чем я просил, без сценариев графического интерфейса.

startPrefs()

Events = Application('System Events')

Prefs = Events.processes['System Preferences']

Prefs.windows[0].scrollAreas[0].buttons.byName("Sharing").click()

delay(1)

ShareWindow = Application("System Events").applicationProcesses.byName("System Preferences").windows.byName("Sharing")

ShareWindow.groups.at(0).scrollAreas.at(0).tables.at(0).rows.at(7).select()

ShareWindow.groups.at(0).popUpButtons.at(0).click().menus.at(0).menuItems.byName("Ethernet").click()

delay(1)

portRows = ShareWindow.groups.at(0).scrollAreas.at(1).tables.at(0).rows()

for (i in portRows) {
    if (portRows[i].textFields.at(0).value() == "Wi-Fi") {
        if (portRows[i].checkboxes.at(0).value() == 0) {
            portRows[i].select()
            portRows[i].checkboxes.at(0).click()
        }
    }
    else {
        if (portRows[i].checkboxes.at(0).value() == 1) {
            portRows[i].select()
            portRows[i].checkboxes.at(0).click()
        }
    }
}

ShareWindow.groups.at(0).scrollAreas.at(0).tables.at(0).rows.at(7).select()

ShareWindow.groups.at(0).scrollAreas.at(0).tables.at(0).rows.at(7).checkboxes.at(0).click()

delay(1)

ShareWindow.sheets.at(0).buttons.byName("Start").click()

delay(30)

ShareWindow.groups.at(0).scrollAreas.at(0).tables.at(0).rows.at(7).select()

ShareWindow.groups.at(0).scrollAreas.at(0).tables.at(0).rows.at(7).checkboxes.at(0).click()

Prefs.quit()

Prefs = Application('System Preferences')

Prefs.quit()

function startPrefs() {
    Prefs = Application('System Preferences')

    Prefs.activate()

    delay(2)

    if (Prefs.windows[0].name() != "System Preferences") {
        Prefs.quit()
        startPrefs()
    }
}
22.11.2014
  • чтобы быть уверенным: в моем ответе также используются сценарии графического интерфейса (все элементы procpref и SystemEvents). В общем, я бы по возможности избегал сценариев GUI (быстрее и надежнее), поэтому активация и раскрытие выполняются без сценариев GUI. 25.11.2014
  • Новые материалы

    HMTL - Многозадачное обучение для решения задач НЛП
    Достижение результатов SOTA путем передачи знаний между задачами Область обработки естественного языка включает в себя десятки задач, среди которых машинный перевод, распознавание именованных..

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..