準備する
これをすべて行うには、XUL DOMにアクセスできるJavaScriptコンソールが必要でした。 ブラウザウィンドウの右下隅にアイコンを追加するFireFox用の非常に簡単な拡張機能を作成しました

このアイコンをクリックすると、JavaScriptコードを記述し、ブラウザー要素を管理できるウィンドウが開きます。 拡張機能はここからダウンロードできます 。
スクリプトを実行するには、CTRL + Enterを押します(テキストボックス要素にフォーカスがあります)。
戦車にいる人のために
すべてのプログラマーがFireFox自体のJavaScriptオブジェクトに精通しているわけではないので、ちょっとした理論が役立つと思います。 HTMLと同様に、「最高のプレイヤー」はウィンドウとドキュメントです。 コンテンツ(HTML DOM)にアクセスするには、このように書く必要があります
var links = window.content. document .getElementsByTagName( 'a' );
// or just
var links = content. document .querySelectorAll( 'a' );
alert(links.length)
* This source code was highlighted with Source Code Highlighter .
var links = window.content. document .getElementsByTagName( 'a' );
// or just
var links = content. document .querySelectorAll( 'a' );
alert(links.length)
* This source code was highlighted with Source Code Highlighter .
var links = window.content. document .getElementsByTagName( 'a' );
// or just
var links = content. document .querySelectorAll( 'a' );
alert(links.length)
* This source code was highlighted with Source Code Highlighter .
もう1つの非常に重要なポイントは、HTML DOMの読み込みの瞬間をキャッチする方法、およびタブとブラウザーを操作する方法です。 tabbrowser要素にアクセスするには、グローバル変数gBrowserを使用できます。 この要素を使用すると、タブを操作できます。 いくつかの例
// add new tab
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
// get browser element for tab
var browser = gBrowser.getBrowserForTab(tab);
// add listeners on page load
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
// listener implementation
}, false );
// add listeners on HTML DOM loaded
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
if ( event .originalTarget instanceof HTMLDocument) {
var document = event .originalTarget;
// listener implementation
}
}, false );
* This source code was highlighted with Source Code Highlighter .
// add new tab
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
// get browser element for tab
var browser = gBrowser.getBrowserForTab(tab);
// add listeners on page load
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
// listener implementation
}, false );
// add listeners on HTML DOM loaded
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
if ( event .originalTarget instanceof HTMLDocument) {
var document = event .originalTarget;
// listener implementation
}
}, false );
* This source code was highlighted with Source Code Highlighter .
// add new tab
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
// get browser element for tab
var browser = gBrowser.getBrowserForTab(tab);
// add listeners on page load
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
// listener implementation
}, false );
// add listeners on HTML DOM loaded
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
if ( event .originalTarget instanceof HTMLDocument) {
var document = event .originalTarget;
// listener implementation
}
}, false );
* This source code was highlighted with Source Code Highlighter .
また、Webページをファイルに保存する方法を学ぶことも役立つと思います。
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
var browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {
var basename = document .location.href.replace(/\/+$/, '' ),
pos = basename.lastIndexOf( '/' );
if (pos != -1) {
basename = basename.substr(pos+1);
}
var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( '/tmp/' +basename);
if (!file.exists()) {
var chosen = new AutoChosen(file, makeFileURI(file));
internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);
}
}
}, false )
* This source code was highlighted with Source Code Highlighter .
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
var browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {
var basename = document .location.href.replace(/\/+$/, '' ),
pos = basename.lastIndexOf( '/' );
if (pos != -1) {
basename = basename.substr(pos+1);
}
var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( '/tmp/' +basename);
if (!file.exists()) {
var chosen = new AutoChosen(file, makeFileURI(file));
internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);
}
}
}, false )
* This source code was highlighted with Source Code Highlighter .
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
var browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {
var basename = document .location.href.replace(/\/+$/, '' ),
pos = basename.lastIndexOf( '/' );
if (pos != -1) {
basename = basename.substr(pos+1);
}
var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( '/tmp/' +basename);
if (!file.exists()) {
var chosen = new AutoChosen(file, makeFileURI(file));
internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);
}
}
}, false )
* This source code was highlighted with Source Code Highlighter .
追加の条件this.contentWindow.document == documentは、ページにiframe要素があり、フレームからではなく、必要なページを1回だけ保存する必要がある場合に状況をフィルタリングします。
internalSave関数(ファイルを保存)およびAutoChosenクラス(ユーザーによるファイルの選択をエミュレートすると理解しているため)については、 ソースコードのコメントを読むことができます 。 ここでファイルを操作するその他の例。
FireFoxをトレーニングします
FireFoxに特定のユーザーとしてHabrにログインするように指示するスクリプトを作成します。
var Crawler = {
habrahabr: function (username, password) {
this .username = username;
this .password = password;
},
onHTMLLoaded: function (browser, callback) {
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument
&& this .contentWindow. document == document
) {
this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );
callback.call( this , event , document );
}
}, false );
return browser;
}
}
Crawler.habrahabr.prototype = {
url: 'http://habrahabr.ru/' ,
openAndSignIn: function (inNewTab) {
var tab = gBrowser.selectedTab, browser = null ;
if (inNewTab) {
tab = gBrowser.addTab( this .url);
} else {
content. document .location = this .url;
}
browser = gBrowser.getBrowserForTab(tab);
var that = this ;
Crawler.onHTMLLoaded(browser, function ( event , document ){
document .location = document .querySelector( 'dl.panel-personal a' ).href;
Crawler.onHTMLLoaded( this , function ( event , document ){
var user = document .getElementById( 'reg-f-username' );
user.value = that.username;
document .getElementById( 'reg-f-password' ).value = that.password;
user.form.querySelector( 'input[type="submit"]' ).click();
});
});
}
};
var cr = new Crawler.habrahabr( 'serjoga' , '***' );
cr.openAndSignIn( true );
* This source code was highlighted with Source Code Highlighter .
var Crawler = {
habrahabr: function (username, password) {
this .username = username;
this .password = password;
},
onHTMLLoaded: function (browser, callback) {
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument
&& this .contentWindow. document == document
) {
this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );
callback.call( this , event , document );
}
}, false );
return browser;
}
}
Crawler.habrahabr.prototype = {
url: 'http://habrahabr.ru/' ,
openAndSignIn: function (inNewTab) {
var tab = gBrowser.selectedTab, browser = null ;
if (inNewTab) {
tab = gBrowser.addTab( this .url);
} else {
content. document .location = this .url;
}
browser = gBrowser.getBrowserForTab(tab);
var that = this ;
Crawler.onHTMLLoaded(browser, function ( event , document ){
document .location = document .querySelector( 'dl.panel-personal a' ).href;
Crawler.onHTMLLoaded( this , function ( event , document ){
var user = document .getElementById( 'reg-f-username' );
user.value = that.username;
document .getElementById( 'reg-f-password' ).value = that.password;
user.form.querySelector( 'input[type="submit"]' ).click();
});
});
}
};
var cr = new Crawler.habrahabr( 'serjoga' , '***' );
cr.openAndSignIn( true );
* This source code was highlighted with Source Code Highlighter .
var Crawler = {
habrahabr: function (username, password) {
this .username = username;
this .password = password;
},
onHTMLLoaded: function (browser, callback) {
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument
&& this .contentWindow. document == document
) {
this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );
callback.call( this , event , document );
}
}, false );
return browser;
}
}
Crawler.habrahabr.prototype = {
url: 'http://habrahabr.ru/' ,
openAndSignIn: function (inNewTab) {
var tab = gBrowser.selectedTab, browser = null ;
if (inNewTab) {
tab = gBrowser.addTab( this .url);
} else {
content. document .location = this .url;
}
browser = gBrowser.getBrowserForTab(tab);
var that = this ;
Crawler.onHTMLLoaded(browser, function ( event , document ){
document .location = document .querySelector( 'dl.panel-personal a' ).href;
Crawler.onHTMLLoaded( this , function ( event , document ){
var user = document .getElementById( 'reg-f-username' );
user.value = that.username;
document .getElementById( 'reg-f-password' ).value = that.password;
user.form.querySelector( 'input[type="submit"]' ).click();
});
});
}
};
var cr = new Crawler.habrahabr( 'serjoga' , '***' );
cr.openAndSignIn( true );
* This source code was highlighted with Source Code Highlighter .
まず、Crawlerオブジェクトを作成し、そこに新しいパーサーを追加できます。 ユーザー名とパスワードを渡すhabrahabrパーサーのコンストラクターを作成します。 habrahabrオブジェクトのプロトタイプにopenAndSignInメソッドを追加します。 このメソッドは、Habrを開いて、特定のユーザーの下で認証することができます。
PS:たくさんのボタンをクリックして2つのサイトでも10ページを閲覧する必要がある場合、バグのテストケースの再生を自動化することがよくあります。