AppleScript: цикл в JavaScript - PullRequest
       26

AppleScript: цикл в JavaScript

1 голос
/ 31 марта 2019

Как я могу повторить этот код, чтобы повторить и установить разные переменные для каждого вхождения класса 'auto-date-time'?

tell application "Safari"
        set myValue to do JavaScript "document.getElementsByClassName('auto-date-time')[0].innerHTML;" in current tab of window 1
    end tell

Например: myValue1 document.getElementsByClassName ('auto-date-time ') [1] MyValue2 document.getElementsByClassName (' auto-date-time ') [2] MyValue3 document.getElementsByClassName (' auto-date-time ') [3

Я прекрасно знаю эту работу

tell application "Safari"
    set myValue to do JavaScript "var outPut=[]; var arr=document.getElementsByClassName('sortable fraudScoringTransactionCCSummary');for (var i in arr) {outPut.push(arr[i].innerHTML)};outPut;" in current tab of window 1
end tell

Но я пытаюсь сделать это по-другому, можно ли это сделать?

Я попробовал это, которое работает, но, очевидно, кажется довольно плохим +, что не будет 't исправить проблему с переменной

     repeat with counter from 1 to 10
    tell application "Safari"
        set myValue to do JavaScript "document.getElementsByClassName('auto-date-time')[" & counter & "].innerHTML;" in current tab of window 1
    end tell

    if myValue = missing value then
        exit repeat
    end if
end repeat

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Я бы сказал, что самый простой и эффективный способ получения списка свойств AppleScript innerHTML значений свойств для набора элементов HTML заключается в следующем:

tell application "Safari" to tell ¬
    the front document to set ¬
    myList to do JavaScript ¬
    "Array.from(
        document.getElementsByClassName('auto-date-time'),
        x => x.innerHTML
    );"

РЕДАКТИРОВАТЬ (2019-04-02):

Обращаясь к комментарию ниже, в котором вы не указали возвращаемое значение, и вместо того, чтобы предоставить возвращаемое консольное значение для JavaScript выше, вот альтернативный метод, который вы можете попробовать:

tell application "Safari" to tell document 1 to set myList to ¬
    do JavaScript "[...document.getElementsByClassName('auto-date-time')]
                   .map( x => x.innerText );"

Двумя отличиями являются использование свойства innerText вместо innerHTML (которое вы также можете применить к первому JavaScript) и метод, используемый для построения массива (хотя предполагается, что вы используете последнюю версию Safari , не должно иметь никакого значения).


Замечание по отлову ошибок

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

0 голосов
/ 31 марта 2019

Найдите это:

Мне нужно использовать список повторов / плюсов, хотя я уверен, что это все-таки неправильный способ сделать это.

set myList to {}

try
    repeat with counter from 1 to 1000
        tell application "Safari"
            set myValue to do JavaScript "document.getElementsByClassName('auto-date-time')[" & counter & "].innerHTML;" in current tab of window 1
        end tell

        if myValue = missing value then
            exit repeat

        else if myValue is not equal to "" then
            set the myList to the myList & myValue
        end if

    end repeat

on error
    --
end try


return myList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...