xpath greasemonkey - PullRequest
       13

xpath greasemonkey

0 голосов
/ 18 апреля 2009

Я пытаюсь изменить gmail в сценарии greasemonkey. Используя xpather, я могу получить выражение xpath для части, которую пытаюсь скрыть. Но используя следующий фрагмент, я не могу получить совпадение. функция оповещения никогда не вызывается. Может кто-нибудь указать мне, что я делаю не так?

var allLinks, thisLink;
allLinks = document.evaluate(
     "//html/body/div[1]/div/div/div[1]/div/div[3]/div[1]/div[2]/div[2]/div[1]/div[1]",
     document,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
  thisLink = allLinks.snapshotItem(i);
  alert("found");
}

@ Alan Storm

Я установил firebug и протестировал скрипт, используя консоль, он работает, но все равно не могу заставить его работать под greasemonkey Greasemonkey до сих пор не дает мне окно предупреждения. Я также попытался добавить прослушиватель событий при загрузке, который тоже не помог.

1 Ответ

2 голосов
/ 18 апреля 2009

Сначала общий совет по отладке, а затем удар по вашей проблеме.

Помните, что сценарии Greasemonkey - это просто javascript, и вы все равно можете использовать все доступные вам инструменты Javascript для устранения вашей проблемы. Откройте gmail, запустите Firebug и попробуйте запустить код javascript непосредственно в командной строке (нажмите стрелку вверх по кругу справа от строки консоли, чтобы увеличить область ввода).

Когда я проделал вышеупомянутое с вашим фрагментом javascript, allLinks.snapshotLength вычислялся как 0, указывая, что ваше выражение xpath ничего не соответствует. Это странно, потому что когда я использовал XPath Checker , он соответствовал логотипу.

Углубившись немного глубже, похоже, что основным документом gmail является ряд элементов iframe, а элементы iframe содержат фактические элементы приложения. В частности, есть фрейм с идентификатором «canvas_frame», который содержит фактический DOM для интерфейса приложения. Когда я пытаюсь

canvas = window.frames[document.getElementById('canvas_frame').name].document;
allLinks = canvas.evaluate(
     "//html/body/div[1]/div/div/div[1]/div/div[3]/div[1]/div[2]/div[2]/div[1]/div[1]",
     canvas,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);

Я получаю ответ длиной 1, который может лучше соответствовать вашим потребностям.

Наконец, это не обязательно, но ваше выражение xPath выглядит немного хрупким. Если gmail даже слегка изменит структуру документа (скажем, с помощью div-оболочки), ваша программа сломается. Рассмотрим что-то вроде этого.

<!-- 
all divs on the page that contains an h1 element 
that contains the text "Gmail Logo" 
-->
//div[contains(./h1,"Gmail Logo")]
...