Проблема присвоения возвращаемого значения doJavaScript переменной (массиву) - PullRequest
0 голосов
/ 09 ноября 2019

Я экспериментирую с JXA и пытаюсь «портировать» небольшой скрипт, который анализирует названия треков с веб-страницы. Этот скрипт в настоящее время работает как макрос Keyboard Maestro и выполняется в текущем окне Safari:

var trackBlock = document.getElementsByClassName("track tracklist_track_title");
var trackList = [];
for (var a of trackBlock) {
    trackList.push(a.innerText);
}
trackList.join("\n");

Проблема заключается в том, что моя попытка переноса работает хорошо в JXA, если doJavaScript возвращает одну строку (переменная trackName1содержит название дорожки):

var sfr = Application("Safari");
var trackName1 = sfr.doJavaScript('document.getElementsByClassName("track tracklist_track_title")[1].innerText', { in: sfr.windows[0].currentTab });
trackName1 // contains track name

Но если я изменю код, чтобы doJavaScript вернул массив (как это было в исходном коде), переменная будет нулевой. Подскажите, пожалуйста, что я делаю не так?

var sfr = Application("Safari");
var trackBlock = sfr.doJavaScript('document.getElementsByClassName("track tracklist_track_title")', { in: sfr.windows[0].currentTab });
trackBlock[0].innerText; // null

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Вот более четкий пример проблемы. Вот код:

var sfr = Application("Safari");
var scr2run = 'document.getElementsByClassName("tracklist_track_title")';
var scr2run1 = 'document.getElementsByClassName("tracklist_track_title")[0]';
var scr2run2 = 'document.getElementsByClassName("tracklist_track_title")[0].innerText';

var trackName = sfr.doJavaScript(scr2run, { in: sfr.windows[0].currentTab });
var trackName1 = sfr.doJavaScript(scr2run1, { in: sfr.windows[0].currentTab });
var trackName2 = sfr.doJavaScript(scr2run2, { in: sfr.windows[0].currentTab });

Вот результат:

app = Application("Safari")
    app.doJavaScript("document.getElementsByClassName(\"tracklist_track_title\")", {in:app.windows.at(0).currentTab})
        --> null
    app.doJavaScript("document.getElementsByClassName(\"tracklist_track_title\")[0]", {in:app.windows.at(0).currentTab})
        --> null
    app.doJavaScript("document.getElementsByClassName(\"tracklist_track_title\")[0].innerText", {in:app.windows.at(0).currentTab})
        --> "From What Is Said To When It's Read"

Почему два первых doJavaScript вызова возвращают null, а третий возвращает ожидаемое значение?

0 голосов
/ 10 ноября 2019

Мне кажется, проблема в следующем утверждении:

trackList.join("\n");

Когда вы помещаете этот код в сценарий JXA, вам нужно экранировать \n:

trackList.join("\\n");

Вот мойскрипт который работает:

'use strict';

(function myMain() {		// function will auto-run when script is executed

var app = Application.currentApplication();
app.includeStandardAdditions = true;

/*
HOW TO USE:
	1. Open Safari to this URL:
	    https://forum.keyboardmaestro.com/
	2. Run this script
*/

var jsStr = `
(function myMain2() {
//debugger;

//return 'Just testing';

var elemCol = document.querySelectorAll('div.category-text-title');
var elemArr = Array.from(elemCol);
var titleArr	= elemArr.map(e => {return e.innerText});

return titleArr.join('\\n');

})();
`

var safariApp = Application("Safari");
var oTab			= safariApp.windows[0].currentTab();
var pageURL		= oTab.url();
var pageTitle = oTab.name();

var jsScriptResults	= safariApp.doJavaScript(jsStr, {in: oTab})

console.log(jsScriptResults);

return jsScriptResults;

})();

//-->RETURNS:
/* Questions & Suggestions

Macro Library

Plug In Actions

Tips & Tutorials

Wiki

Announcements

Status Menu Icons

Forum Admin
 */
...