iTunes 10.6.3 меняет интерфейс AppleScript?
У меня есть простой скрипт на Ruby, который использует гем rb-appscript для управления iTunes, и теперь, когда я обновился до iTunes 10.6.3, он, похоже, не работает.
До 10.6.3 этот фрагмент кода работал бы так, как ожидалось, чтобы получить текущие выбранные треки:
Appscript.app('iTunes').selection.get()
Теперь выдает следующую ошибку:
RuntimeError: Unknown property, element or command: 'selection'
Изменить: только что подтвердил, что это также не работает в py-appscript, поэтому он не изолирован для rb-appscript.
Что странно, потому что следующая часть фактического AppleScript все еще работает:
tell application "iTunes" to get selection
Подобные примеры, такие как Appscript.app('Finder').desktop.files.get()
все еще работают.
Я не смог найти никакой информации, которая объяснила бы, если или почему это было изменено или что я мог сделать, чтобы обновить мой сценарий. Я предполагаю, что это как-то связано с изменениями Mountain Lion.
3 ответа
Похоже, iTunes 10.6.3 был выпущен с песочницей, которая идет с Mountain Lion. Вот статья, рассказывающая об этом (читайте также комментарии) http://www.leancrew.com/all-this/2012/06/the-first-nail-in-the-coffin-of-python-appscript/
Вероятно, начнет происходить гораздо больше (если не со всем), как от Mountain Lion
Я предоставил исправление для этой проблемы здесь:
https://github.com/mattneub/appscript/tree/master/rb-appscript
Да, они определенно сломали это. Вы МОЖЕТЕ использовать rb-appscript с приложением "Системные события" для условной проверки дочерних элементов различных элементов пользовательского интерфейса, чтобы узнать, является ли атрибут "selected" истинным.... например:
i = 0
row_exists = true
selected_row = nil
while row_exists && !selected_row
i += 1
row_exists = app("System Events").application_processes["iTunes"].windows["iTunes"].scroll_areas[3].outlines[1].rows[i].exists
if row_exists
if (app("System Events").application_processes["iTunes"].windows["iTunes"].scroll_areas[3].outlines[1].rows[i].attributes["AXSelected"].value.get == true)
selected_row = app("System Events").application_processes["iTunes"].windows["iTunes"].scroll_areas[3].outlines[1].rows[i]
end
end
end
Затем вы можете извлечь необходимую информацию из дочерних элементов выбранной строки. Это было бы довольно раздражающим способом пойти об этом, все же.