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