1

作为公司产品的一部分,用户必须在浏览器中添加一个书签(一个执行 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 执行与书签关联的脚本:

  1. 创建一个单行脚本并进行“开放”声明。它适用于 Firefox 浏览器 11.0 版,但在 Firefox 23.0 上会导致非致命故障。在 Firefox 23.0 上时,Selenium 脚本会暂停并等待窗口出现而忽略框架弹出窗口。最终脚本在抛出错误后恢复。
  2. 编写一个自定义用户扩展,根据请求执行脚本

我尝试将以下三个扩展添加到 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();

任何人都可以帮我找出我做错了什么吗?非常感谢任何有用的建议。

4

2 回答 2

1

我希望我的回应还不算太晚。

首先,我看到了两个问题。

1)错误信息看起来很精确。如果你看你的代码

Selenium.prototype.doRunGeneralScript = function(){
  script.doGeneralScript();
}
  • 变量 'script' 存在于 doRunGenerateScript 方法中而没有被定义。那不管用

2) 您将无法直接访问 Selenuim 对象内的文档。要获取“文档”对象,请使用:

var document = this.browserbot.getDocument();

我希望这会有所帮助:-)

于 2014-08-06T17:57:26.767 回答
1

我遇到了同样的问题。下面是我修复它的原因:

  1. 创建一个文件名为“user-extensions.js”的文件。
  2. 将此文件存储在您站点的公共目录中。
  3. 在 'Options' > 'Options' > 'Selenium Core extensions (user-extensions.js)' 中加载此文件
  4. 重新启动硒

您可能仍然会收到一个弹出窗口,其中包含无法找到脚本的错误,但事实并非如此 - 它应该可以工作。

当您更新您的 user-extensions.js 文件时,您必须重新启动Selenium。选中“激活开发者工具”复选框,以便能够按下“重新加载”按钮。这样就可以在不重新启动 Selenium 的情况下重新加载脚本。

于 2013-11-07T15:19:54.830 回答