Как программно нажать кнопку «Создать» в GMail с помощью greasemonkey? - PullRequest
3 голосов
/ 03 января 2011

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

// ==UserScript==
// @name           GMC Test
// @namespace      com.pbg
// @description    test
// @include        http*://mail.google.com*
// ==/UserScript==

//loading function
function tryAgain(tries) {
    setTimeout(function() { init(tries++); }, 1000*tries);
}

//gets a node by XPath
function getNodeByXPath(expression, parent) {
   var r = parent.evaluate(expression, parent, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
   return ((r != null) ? r.iterateNext() : null);
}

//initialize
function init(tries) {

   tries = tries || 0;
   if (tries > 3) return; // give up, too many tries
   // Locate the canvas_frame iframe
   var f = document.getElementById("canvas_frame");
   if (f == null) return tryAgain(tries);
   // Locate the document
   var doc = f.contentWindow.document;
   if (doc == null) return tryAgain(tries);
   // make sure all the links are loaded
   if (getNodeByXPath("//a[contains(@href,'#inbox')]", doc) == null) return tryAgain(tries);

   go();
}
function go() {

   function fireEvent(xPath,event)//https://developer.mozilla.org/en/DOM/element.dispatchEvent
   {
      var evt = document.createEvent("MouseEvents");
      evt.initMouseEvent(event, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
      var cb = getNodeByXPath(xPath, doc);
      var canceled = !cb.dispatchEvent(evt);
      GM_log("event canceled = " + canceled);
   }
   var doc = document.getElementById("canvas_frame").contentWindow.document;

   //THE LINE BELOW WORKS
   //setTimeout(function(){GM_log("let's click starred!");fireEvent("//a[contains(@href,'#starred')]", "click")}, 5000); 

   //THIS DOENS'T WORK
   setTimeout(function(){GM_log("now let's click compose!");fireEvent("//div[@class='J-Zh-I J-J5-Ji L3')]", "click")}, 5000);
}

window.addEventListener('load', init, false );

1 Ответ

3 голосов
/ 05 июля 2011

Если вы используете более новый GMail в стиле AJAX-y, вы можете просто изменить href страницы на составной URL следующим образом * и просто позволить обработчикам событий страницы запускать / обрабатывать изменение хэштега как обычно:

document.location.href = "#compose";

В качестве альтернативы, если вы используете базовое представление HTML, вы можете использовать xPath, чтобы найти якорь составления почты и изменить document.location.href, чтобы соответствовать тому, на что указывает ссылка.

Я уверен, что можно написать более элегантный / устойчивый к изменению xPath, но краткий обзор только сейчас показывает, что для него установлен атрибут accesskey, равный c, который, вероятно, достаточно отличителен для поиска правильной ссылки:

var nodesSnapshot = document.evaluate(
    '//*[@accesskey="c"]', 
     document,
     null,
     XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
     null
  );

document.location.href = nodesSnapshot.snapshotItem(0).href;

* Примечание: оба были протестированы и работают в Firebug, но могут работать по-разному в скрипте Greasemonkey из-за использования iFrames в представлении AJAX-y / других факторов и т. Д.

...