2009-04-18 3 views
0

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

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 Сторм

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

+0

@ Хамза, похоже, что у вас больше проблем с xpath. Кто-то может помочь, если вы разместили весь скрипт greasemonkey. –

ответ

2

Во-первых, общий отладочный наконечник, а затем удар по вашей проблеме.

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

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

Копаем немного глубже, похоже, что основным документом gmail является ряд фреймов, а в 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")] 
+0

Если я запустил var canvas = window.frames [document.getElementById ('canvas_frame'). Name] .document; if (canvas) alert ('got canvas'); Я не получаю предупреждения. И если я запустил var canvas = document.getElementById ('canvas_frame'); if (canvas) alert ('got canvas'); Я получаю предупреждение, но холст не выполняет функцию оценки. Что я делаю не так? –

Смежные вопросы