Букмарклет, работающий на 2 страницах

Я использую букмарклет для вставки JavaScript в веб-страницу. Я пытаюсь войти в свою учетную запись gmail (эта часть работает) и в моей учетной записи gmail автоматически нажимает папку " Отправленные " при загрузке страницы. Это стартовая страница:

Это код, который я использую в букмарклет:

javascript:
document.getElementById('Email').value='myEmail@gmail.com';
document.getElementById('next').click();
setTimeout(function(){
document.getElementById('Passwd').value='myPassword';
document.getElementById('signIn').click();},1000);

setTimeout(function(){
document.getElementsByClassName("J-Ke n0 aBU")[0].click();
},6000);

J-Ke n0 aBU класс отправленной папки. Этот код входит в мою учетную запись, но не нажимает кнопку "Отправленные".

Я заметил подобное поведение на других сайтах; всякий раз, когда новая страница загружается или обновляется, букмарклет перестает работать.
Почему это так и как правильно использовать один и тот же букмарклет на другой странице, чем он был изначально нажат.

2 ответа

Решение

Отказ от ответственности: у меня нет Gmail, поэтому я не проверял это специально для Gmail.
Этот ответ существует для вашего комментария:

Как насчет фреймов. Теоретически возможно использовать вход в gmail в iframe и, следовательно, когда iframe переходит на другую страницу, это не влияет на букмарклет?

Да, технически возможно иметь постоянный букмарклет, использующий фреймы (или, не дай бог, набор фреймов).
Пока ваше родительское окно (и оно содержит iframe) остается в одном домене, оно должно работать в соответствии с междоменной спецификацией.
Однако возможно (в зависимости от используемого метода) преднамеренно (не) "противодействовать" этому (которое, в зависимости от используемого противодействия, все же можно обойти и т. Д.).

Перейдите на сайт, затем выполните букмарклет, который:

  • Создает iframe.
  • Устанавливает обработчик нагрузки на iframe.
  • Заменяет текущий контент веб-страницы на iframe (на полную ширину и высоту окна).
  • Установите в качестве источника iframe текущий URL (перезагрузите открытую в настоящий момент страницу в введенном iframe).

Тогда задача iframe onload-handler состоит в том, чтобы определить (используя url/title/page-content), какая страница загружена и какие (если есть) действия следует предпринять.

Пример (минимизировать (убрать комментарии и лишние пробелы), используя Packer Дина Эдварда v3):

javascript:(function(P){
  var D=document
  ,   B=D.createElement('body')
  ,   F=D.createElement('iframe')
  ; //end vars
  F.onload=function(){
    var w=this.contentWindow     //frame window
    ,   d=w.document             //frame window document
    ; //end vars
    //BONUS: update address-bar and title. 
    //Use location.href instead of document.URL to include hash in FF, see https://stackru.com/questions/1034621/get-current-url-in-web-browser
    history.replaceState({}, D.title=d.title, w.location.href ); 
    P(w, d);        //execute handler
  };
  D.body.parentNode.replaceChild(B, D.body);   //replace body with empty body
  B.parentNode.style.cssText= B.style.cssText= (
   F.style.cssText= 'width:100%;height:100%;margin:0;padding:0;border:0;'
  ) + 'overflow:hidden;' ;           //set styles for html, body and iframe
  //B.appendChild(F).src=D.URL; //doesn't work in FF if parent url === iframe url
  //B.appendChild(F).setAttribute('src', D.URL); //doesn't work in FF if parent url === iframe url
  B.appendChild(F).contentWindow.location.replace(D.URL); //works in FF
}(function(W, D){   //payload function. W=frame window, D=frame window document
  alert('loaded');
  // perform tests on D.title, W.location.href, page content, etc.
  //   and perform tasks accordingly
}));

Примечание: один из очевидных способов дальнейшего минимизации заключается в использовании скобочного доступа со строковыми переменными для таких вещей, как createElement, contentWindow и т. Д.

Вот пример тела функции для функции полезной нагрузки (сверху букмарклет), который будет использоваться на http://www.w3schools.com/ (извините, я не мог быстро придумать другую цель):

var tmp;
if(D.title==='W3Schools Online Web Tutorials'){
  //scroll colorpicker into view and click it after 1 sec
  tmp=D.getElementById('main').getElementsByTagName('img')[0].parentNode;
  tmp.focus();
  tmp.scrollIntoView();
  W.setTimeout(function(){tmp.click()},1000);
  return;
}
if(D.title==='HTML Color Picker'){
  //type color in input and click update color button 'ok'
  tmp=D.getElementById('entercolorDIV');
  tmp.scrollIntoView();
  tmp.querySelector('input').value='yellow';
  tmp.querySelector('button').click();

  //click 5 colors with 3 sec interval
  tmp=D.getElementsByTagName('area');
  tmp[0].parentNode.parentNode.scrollIntoView();
  W.setTimeout(function(){tmp[120].click()},3000);
  W.setTimeout(function(){tmp[48].click()},6000);
  W.setTimeout(function(){tmp[92].click()},9000);
  W.setTimeout(function(){tmp[31].click()},12000);
  W.setTimeout(function(){tmp[126].click()},15000);
  return;
}

Приведенный выше пример (внутри букмарклета) минимизирован:

javascript:(function(P){var D=document,B=D.createElement('body'),F=D.createElement('iframe');F.onload=function(){var w=this.contentWindow,d=w.document;history.replaceState({},D.title=d.title,w.location.href);P(w,d)};D.body.parentNode.replaceChild(B,D.body);B.parentNode.style.cssText=B.style.cssText=(F.style.cssText='width:100%;height:100%;margin:0;padding:0;border:0;')+'overflow:hidden;';B.appendChild(F).contentWindow.location.replace(D.URL)}(function(W,D){var tmp;if(D.title==='W3Schools Online Web Tutorials'){tmp=D.getElementById('main').getElementsByTagName('img')[0].parentNode;tmp.focus();tmp.scrollIntoView();W.setTimeout(function(){tmp.click()},1000);return}if(D.title==='HTML Color Picker'){tmp=D.getElementById('entercolorDIV');tmp.scrollIntoView();tmp.querySelector('input').value='yellow';tmp.querySelector('button').click();tmp=D.getElementsByTagName('area');tmp[0].parentNode.parentNode.scrollIntoView();W.setTimeout(function(){tmp[120].click()},3000);W.setTimeout(function(){tmp[48].click()},6000);W.setTimeout(function(){tmp[92].click()},9000);W.setTimeout(function(){tmp[31].click()},12000);W.setTimeout(function(){tmp[126].click()},15000);return}}));

Надеюсь, это поможет (вы начали)!

Поскольку JavaScript выполняется только в контексте текущей страницы, невозможно выполнить JavaScript, который охватывает более одной страницы. Поэтому, когда загружается вторая страница, выполнение JavaScript первой страницы останавливается.

Если будет возможно выполнить JavaScript на двух страницах, злоумышленник может отправить вас на другую страницу, прочитать там вашу личную информацию и отправить ее на другой сервер, находящийся под его контролем, с помощью AJAX (например, ваши письма).

Решением для вашей проблемы будет использование Selenium IDE для Firefox ( прямая ссылка на расширение). Первоначально разработанный для автоматического тестирования, он также может быть использован для автоматизации вашего браузера.

Другие вопросы по тегам