可在2页上工作的bookmarklet

时间:2015-11-02 16:03:12

标签: javascript html bookmarklet

我使用书签将javascript注入网页。我正在尝试登录我的Gmail帐户(该部分有效),并且在我的Gmail帐户中,当页面加载时,会自动点击已发送文件夹。这是起始页面: enter image description here

这是我在bookmarklet中使用的代码:

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 个答案:

答案 0 :(得分:2)

免责声明:我没有gmail,所以我没有专门针对gmail进行测试。
这个答案的存在是为了解决your comment

  

iframe怎么样?理论上可以在iframe中使用gmail登录,因此当iframe更改为另一个页面时,这对bookmarklet没有影响吗?

是的,技术上可以使用iframe(或者deity forbid,一个框架集)使用持久性书签
只要您的父窗口(以及它包含iframe)保留在同一个域上,它就应该按照跨域规范工作。
然而,有可能(取决于使用的方法)(非)有意地“反作用”'这(取决于使用的反作用,仍然可以规避,等等。)。

导航到网站,然后执行bookmarklet:

  • 创建iframe。
  • 将onload-handler设置为iframe。
  • 用iframe替换当前网页内容(到窗口的全宽和高度)。
  • 将iframe的源设置为当前网址(重新加载注入的iframe中当前打开的网页)。

然后,iframe的onload-handler的工作是检测(使用url / title / page-content)加载了哪个页面以及应采取的操作(如果有的话)。

示例(使用Dean Edward's 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://stackoverflow.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上使用的有效负载函数(来自上面的bookmarklet)的示例函数体(抱歉,我无法快速想到另一个目标):

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}}));

希望这会有所帮助(您开始使用)!

答案 1 :(得分:1)

由于JavaScript仅在当前页面的上下文中执行,因此无法执行跨越多个页面的JavaScript。因此,无论何时加载第二页,第一页的JavaScript的执行都会停止。

如果可以在两个页面上执行JavaScript,攻击者可以将您发送到另一个页面,在那里读取您的个人信息并通过AJAX将其发送到他控制的另一台服务器(例如您的邮件)。

针对您的问题的解决方案是将Selenium IDE用于Firefox(direct link to the extension)。最初设计用于自动化测试,它还可用于自动化您的浏览器。