UxUによるGreasemonkeyスクリプトのテスト
概要
テストケースの実行コンテキストではGM_xmlhttpRequest()などの代表的なGM関数を利用できます。ヘルパーメソッドのutils.include()などを使用してGreasemonkeyスクリプトを読み込むことで、Greasemonkeyスクリプト内で定義された関数などのテストを行えます。
- ※スクリプトの前後に
(function() { ... })()のようなコードを加えている場合、スクリプト内で定義された関数などにアクセスできませんので、それらをあらかじめ取り除いておいてください。なお、現在のGreasemonkeyは個々のスクリプトを別々の名前空間で実行する仕様になっているため、上記のコードは必要ありません。 - ※UxUは代表的なGM関数の動作を独自にエミュレートするため、UxU上でのテストの実行時にはGreasemonkeyのインストールは不要です。ただし、一部のGM関数は実際には何も処理を行いませんのでご注意下さい。
また、実際のWebページ上でのスクリプトの動作をテストするために、テスト用のページを読み込んでその上でスクリプトを動作させることもできます。以下は、sample1.user.jsとsample2.user.jsのテストの例です。
var description = 'Greasemonkey test';
// ページの読み込み完了を待つため、非同期型のテストにする。
var isAsync = true;
var sandbox;
function setUp() {
// まず、テスト用のページを読み込む。
yield Do(greasemonkey.load('http://www.clear-code.com/'));
// サンドボックス内にGreasemonkeyスクリプトを読み込む。
// greasemonkey.loadScript()の返り値はそのスクリプト用に
// 生成されたサンドボックス。
sandbox = greasemonkey.loadScript('sample1.user.js');
greasemonkey.loadScript('sample2.user.js');
}
function tearDown() {
// テスト用ページ、サンドボックスを破棄
yield Do(greasemonkey.unload());
}
function testDefined() {
// スクリプト内で定義された関数や変数は、
// そのスクリプト用に作成されたサンドボックスの
// プロパティとしてアクセスできる。
assert.isDefined(sandbox.setAndGetValue);
}
function testGetTitleAndURI() {
// サンドボックスは、スクリプト名を指定して
// 必要な時点で取得することもできる。
var anotherSandbox = greasemonkey.getSandboxFor('sample2.user.js');
assert.isTrue(anotherSandbox.getDocumentTitleAndURI());
}
function testGMFunction() {
// イベントリスナを登録してGM関数の処理をハンドリングできる。
var listener = {
key : null,
value : null,
onGM_setValueCall : function(aEvent) {
// GM_setValueが呼ばれた時にここに来る。
this.key = aEvent.key;
this.value = aEvent.value;
}
};
greasemonkey.addListener(listener);
sandbox.setAndGetValue();
assert.equals('testKey', listener.key);
assert.equals('testValue', listener.value);
}
function testPageLoading() {
assert.isNull(sandbox.loadedPageTitle);
// GM_xmlhttpRequestを使用する関数を実行し、
// 読み込みの完了を待って次に進む
yield Do(greasemonkey.doAndWaitLoad(function() {
sandbox.loadAndGetPageTitle();
}));
assert.equals('サービス -ClearCode Inc.', sandbox.loadedPageTitle);
}
テストケースで利用可能なヘルパーメソッド
- Object
greasemonkey.load(in String aURI)
- テスト用のブラウザフレーム内に、指定したURIを読み込みます。実行すると、
valueプロパティにfalseがセットされたオブジェクトを返します。ロード完了後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。なお、前回読み込まれたページに対して読み込まれたスクリプト用のサンドボックスやイベントリスナはすべて破棄されます。
- Object
greasemonkey.unload()
- テスト用のブラウザフレーム内に読み込まれたページを破棄し、スクリプト用のサンドボックスやイベントリスナをすべて破棄します。実行すると、
valueプロパティにfalseがセットされたオブジェクトを返します。ページの破棄完了後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。
- Object
greasemonkey.open(in String aURI)
- テスト用のブラウザウィンドウを開き、指定したURIを読み込みます。実行すると、
valueプロパティにfalseがセットされたオブジェクトを返します。ウィンドウが開かれてページが読み込まれた後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。なお、前回読み込まれたページに対して読み込まれたスクリプト用のサンドボックスやイベントリスナはすべて破棄されます。
- void
greasemonkey.close()
- テスト用のブラウザウィンドウを閉じ、スクリプト用のサンドボックスやイベントリスナをすべて破棄します。ウィンドウが開かれていない場合は何もしません。
- Object
greasemonkey.loadScript(in String aURI)
- 指定したURIのスクリプトに対してサンドボックスを生成し、そのサンドボックスを実行コンテキストとしてスクリプトを評価します。返り値は生成されたサンドボックスです。
- Object
greasemonkey.getSandboxFor(in String aURI)
- 指定したURIのスクリプトに対して生成されたサンドボックスを取得します。
- Object
greasemonkey.doAndWaitLoad(in Function aFunction, [in Object aContext])
- 渡された関数を実行し、
valueプロパティにfalseがセットされたオブジェクトを返します。GM_xmlhttpRequest()による通信が完了すると、返り値として返したオブジェクトのvalueプロパティがtrueになります。渡された関数内やこのヘルパーメソッドの実行の直前にGM_xmlhttpRequest()が呼ばれていない場合、UxUはタイムアウトするまで待った後にテスト失敗と見なします。
- void
greasemonkey.addListener(in Object aEventListener)
- イベントリスナ(後述)を登録します。
- void
greasemonkey.removeListener(in Object aEventListener)
- 登録済みのイベントリスナ(後述)を削除します。
greasemonkey.load(in String aURI)valueプロパティにfalseがセットされたオブジェクトを返します。ロード完了後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。なお、前回読み込まれたページに対して読み込まれたスクリプト用のサンドボックスやイベントリスナはすべて破棄されます。greasemonkey.unload()valueプロパティにfalseがセットされたオブジェクトを返します。ページの破棄完了後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。greasemonkey.open(in String aURI)valueプロパティにfalseがセットされたオブジェクトを返します。ウィンドウが開かれてページが読み込まれた後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。なお、前回読み込まれたページに対して読み込まれたスクリプト用のサンドボックスやイベントリスナはすべて破棄されます。greasemonkey.close()greasemonkey.loadScript(in String aURI)greasemonkey.getSandboxFor(in String aURI)greasemonkey.doAndWaitLoad(in Function aFunction, [in Object aContext])valueプロパティにfalseがセットされたオブジェクトを返します。GM_xmlhttpRequest()による通信が完了すると、返り値として返したオブジェクトのvalueプロパティがtrueになります。渡された関数内やこのヘルパーメソッドの実行の直前にGM_xmlhttpRequest()が呼ばれていない場合、UxUはタイムアウトするまで待った後にテスト失敗と見なします。greasemonkey.addListener(in Object aEventListener)greasemonkey.removeListener(in Object aEventListener)以上のユーティリティメソッドはグローバル関数としても利用できます。グローバル関数として利用する場合の名前は以下のようになります(引数等の利用法は全く同一です):
greasemonkeyLoad(),
greasemonkeyUnload(),
greasemonkeyLoadScript(),
greasemonkeyGetSandboxFor(),
greasemonkeyAddListener(),
greasemonkeyRemoveListener()
イベントリスナによるイベントの捕捉
greasemonkey.addListener()には、以下のようなオブジェクトをイベントリスナとして登録できます。
var listener = {
onGM_xmlhttpRequestCall : function(aEvent) {
},
onGM_xmlhttpRequestBeforeLoad : function(aEvent) {
},
onGM_xmlhttpRequestLoad : function(aEvent) {
}
};
イベント名に対応するメソッドを定義する代わりに、handleEvent()でもイベントを捕捉できます。
var listener = {
handleEvent : function(aEvent) {
switch (aEvent.type)
{
case 'GM_xmlhttpRequestCall':
break;
case 'GM_xmlhttpRequestBeforeLoad':
break;
case 'GM_xmlhttpRequestLoad':
break;
}
}
};
イベントリスナが捕捉できるイベントは以下の通りです。
| イベント名 | 発行タイミング | 渡されるイベントオブジェクトが持つプロパティ |
|---|---|---|
| GM_logCall | GM_log()が呼ばれた時。 |
|
| GM_getValueCall | GM_getValue()が呼ばれた時。 |
|
| GM_setValueCall | GM_setValue()が呼ばれた時。 |
|
| GM_xmlhttpRequestCall | GM_xmlhttpRequest()が呼ばれた時。 |
|
| GM_xmlhttpRequestBeforeLoad | GM_xmlhttpRequest()による読み込みが完了し、loadイベントが発行された時。 |
|
| GM_xmlhttpRequestLoad | GM_xmlhttpRequest()による読み込みが完了し、loadイベントが発行され、Greasemonkeyスクリプトで定義されたイベントリスナによる処理が完了した時。 |
|
| GM_xmlhttpRequestBeforeError | GM_xmlhttpRequest()による読み込みが中断され、errorイベントが発行された時。 |
|
| GM_xmlhttpRequestError | GM_xmlhttpRequest()による読み込みが中断され、errorイベントが発行され、Greasemonkeyスクリプトで定義されたイベントリスナによる処理が完了した時。 |
|
| GM_xmlhttpRequestBeforeReadystatechange | GM_xmlhttpRequest()による読み込みが進行し、readystatechangeイベントが発行された時。 |
|
| GM_xmlhttpRequestReadystatechange | GM_xmlhttpRequest()による読み込みが進行し、readystatechangeイベントが発行され、Greasemonkeyスクリプトで定義されたイベントリスナによる処理が完了した時。 |
|
| GM_registerMenuCommandCall | GM_registerMenuCommand()が呼ばれた時。 |
|
| GM_addStyleCall | GM_addStyle()が呼ばれた時。 |
|
| GM_getResourceURLCall | GM_getResourceURL()が呼ばれた時。 |
|
| GM_getResourceTextCall | GM_getResourceText()が呼ばれた時。 |
|
| GM_openInTabCall | GM_openInTab()が呼ばれた時。 |
|