会社の製品の一部として、ユーザーはブラウザーにブックマークレット (URL を開く代わりに JavaScript コードを実行するブックマーク ボタン) を追加する必要があります。ブックマークレットのソース コードは次のとおりです。
javascript: (function () {
var d = document;
var script = d.createElement('scr'+'ipt');
script.src = 'https://<Company_URL>/Bookmarklet/ScriptContent?scriptFile=bm-script.js&rnd=' + Math.floor(Math.random() * 99999);
if (typeof script.onload === 'object') {
script.onload = function () {
doGeneralScript();
};
}
else {
script.onreadystatechange = function() {
if (this.readyState == 'complete' || this.readyState == 'loaded') {
doGeneralScript();
}
};
}
d.getElementsByTagName('head')[0].appendChild(script);
}());
コードは基本的に、いくつかのコントロールを含むフレーム ポップアップを開きます。ユーザーの次のステップは、コントロールの 1 つをクリックすることです。その間、Selenium IDE は共通領域の外にあるボタンをクリックすることができないため、Selenium IDE でブックマークレットに関連付けられたスクリプトを実行するには 2 つの方法があります。
- ワンライナー スクリプトを作成し、「open」ステートメントを作成します。Firefox ブラウザー バージョン 11.0 では完全に動作しますが、Firefox 23.0 では致命的ではないエラーが発生します。最終的に、スクリプトはエラーをスローした後に再開します。
- リクエストに応じてスクリプトを実行するカスタム ユーザー拡張機能を作成する
Selenium Core 拡張機能 (user-extensions.js) に以下の 3 つの拡張機能を追加してみました
Selenium.prototype.doMbProduction = function()
{
var d = document;
var script = d.createElement('scr' + 'ipt');
script.src = 'https://<Company_URL>/Bookmarklet/ScriptContent?scriptFile=bm-script.js&rnd=' + Math.floor(Math.random() * 99999);
if (typeof script.onload === 'object') {
script.onload = this.doRunGeneralScript();
} else {
script.onreadystatechange = this.doPerformLoad();
}
d.getElementByTagName('head')[0].appendChild(script);
}
Selenium.prototype.doRunGeneralScript = function(){
script.doGeneralScript();
}
Selenium.prototype.doPerformLoad = function()
{
if (this.readyState == 'complete' || this.readyState == 'loaded') {
this.doRunGeneralScript();
}
}
しかし、それはうまくいきません。コマンドmbProductionを実行すると、スクリプトは致命的なエラーをスローします
[エラー] 予期しない例外: ReferenceError: スクリプトが定義されていません。ファイル名 -> chrome://selenium-ide/content/tools.js -> ファイル:///C:/Users/3pf/Downloads/sideflow1.js?1376849717650、行番号 -> 124
カスタム ユーザー拡張機能の 124 行目は script.doGeneralScript(); です。
誰かが私が間違っていることを見つけるのを手伝ってくれますか? 役立つ提案は大歓迎です。