Сначала общий совет по отладке, а затем удар по вашей проблеме.
Помните, что сценарии 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")]