作为公司产品的一部分,用户必须在浏览器中添加一个书签(一个执行 JavaScript 代码而不是打开 URL 的书签按钮)。书签的源代码如下:
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);
}());
该代码基本上会打开一个带有一些控件的框架弹出窗口,用户的下一步是单击其中一个控件。同时,Selenium IDE 无法单击位于公共区域之外的按钮,因此有两种方法可以通过 Selenium IDE 执行与书签关联的脚本:
- 创建一个单行脚本并进行“开放”声明。它适用于 Firefox 浏览器 11.0 版,但在 Firefox 23.0 上会导致非致命故障。在 Firefox 23.0 上时,Selenium 脚本会暂停并等待窗口出现而忽略框架弹出窗口。最终脚本在抛出错误后恢复。
- 编写一个自定义用户扩展,根据请求执行脚本
我尝试将以下三个扩展添加到 Selenium Core 扩展(user-extensions.js)
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, lineNumber -> 124
我的自定义用户扩展中的第 124 行是 script.doGeneralScript();
任何人都可以帮我找出我做错了什么吗?非常感谢任何有用的建议。