【Apple Script】element 要素があるかの判別

Apple Script から javascript を使って、HTML の element 要素を取得しようと、以下のようなコードを書くと、


my getXPathByText("a","次へ")

on getXPathByText(theTag, theText)
    tell application "Safari"
        set val to do JavaScript "
        val = '';
        var lists = document.getElementsByTagName('" & theTag & "');
        for ( var i = 0; i < lists.length; i++ ) {
            var ele = lists[i];
            if(ele.innerHTML == '" & theText & "'){
                val = getXpath(ele);
                break;
            }
        }

function getXpath(element) {
  if(element && element.parentNode) {
    var xpath = getXpath(element.parentNode) + '/' + element.tagName;
    var s = [];

    for(var i = 0; i < element.parentNode.childNodes.length; i++) {
      var e = element.parentNode.childNodes[i];
      if(e.tagName == element.tagName) {
        s.push(e);
      }
    }

    if(1 < s.length) {
      for(var i = 0; i < s.length; i++) {
        if(s[i] === element) {
          xpath += '[' + (i+1) + ']';
          break;
        }
      }
    }

    return xpath.toLowerCase();
  } else {
    return '';
  }
}

        res = val;
        " in document 1
        if val is not "" then
            return val
        end if
        return ""
    end tell
end getXPathByText

もし、目的の要素がない場合、返り値を取得するまでに、時間がかかってしまうことがある。

なので、あらかじかめ、DOMを文字列として取得しておき、その中に目的の要素に含まれる文字列が入っているかどうかを確認しておいた方が早い。


set html to my documentElement()

if my find(html, ">次へ</") is false then
    return
end if

on find(targetStr, findStr)
    if (offset in targetStr of findStr) = 0 then
        false
    else
        true
    end if
end find

on documentElement()
    tell application "Safari"
        set val to do JavaScript "
            res = document.documentElement.outerHTML;
        " in document 1
    end tell
    return val
end documentElement