Selenium IDE - 错误:<http:www.example.com =“”>的权限被拒绝获取属性Location.href </http:>

时间:2012-04-05 04:37:46

标签: javascript selenium cross-domain

我在Ubuntu 11.10上运行的Firefox 11上使用Selenium 1.7.2。直到昨天,我们还没有使用document.domain javascript。我们需要将它添加到我们生成的HTML和我们的一个javascript文件中。 现在,当我们运行Selenium IDE Test Suite时,我们收到以下错误:

Error: Permission denied for <http://dev.example.com> to get property Location.href

dev.example.com是我们的应用服务器(Glassfish 3.1.2落后于Apache + mod_jk)

如果我评论document.domain一切正常(至少在Firefox中,因为document.domain是为了阻止IE阻止PIE.htc脚本... 叹息

我尝试添加找到here的用户扩展程序脚本:

function setdom(str,doc,dom) {
  doc.domain = dom;
}

Selenium.prototype.doDocumentDomain = function(domain) {
  var lw;
  setdom('ts',frames['testSuiteFrame'].document, domain);
  setdom('tf', getTestFrame().contentWindow.document, domain);
  setdom('my', frames['myiframe'].document, domain);

  lw = LOG.getLogWindow();
  if (lw) {
    setdom('log', lw.document, domain);
    }
  setdom('doc', document, domain);
  }

但这看起来很旧,可能不再兼容了。它在第一次调用setdom('ts',frames['testSuiteFrame'].document,domain);

时返回错误

我不是在HTTP和HTTPS之间来回浏览,我已经阅读了很多与StackOverflow和Google Group相关的问题,但没有结果。

我可以修改我们的代码,仅为IE包含​​document.domain,但它不是很干净......

问题:如何在设置document.domain时使Selenium IDE无安全问题?或者我如何修复他在用户扩展之上以便在Selenium IDE 1.7.2中工作?谢谢。

1 个答案:

答案 0 :(得分:0)

所以我决定更改Selenium javascript以允许我使用它来设置document.domain:

在第920行的chrome / content / selenium-core / scripts / selenium-browserbot.js中(版本1.7.2):

    //Samit: Fix: open command sometimes fails if current url is chrome and new is not
    windowObject = core.firefox.unwrap(windowObject);
    // -------------- Start My Change ----------------
    updateDomain(windowObject.document);
    // -------------- End My Change ----------------
    if (this._windowClosed(windowObject)) {
        LOG.debug("pollForLoad WINDOW CLOSED (" + marker + ")");
        delete this.pollingForLoad[marker];
        return;
    }

然后在user-extensions.js中:

var validDomain = null;

Selenium.prototype.doDocumentDomain = function(domain) {
  validDomain = domain;
}

function updateDomain(doc) {
  if(validDomain==null) {
    return;
    }
  LOG.info("Current domain: " + doc.domain);
  if(doc.domain != validDomain && (doc.domain+"").indexOf(validDomain)>0 ) {
    doc.domain = validDomain;
    }
  LOG.info("New domain: " + doc.domain);
  }

我在设置新域之前检查它是我想要设置的域的子域。我在Selenium IDE中使用它:

documentDomain | example.com

因此,当它打开dev.example.com和static.example.com时,它会在域中找到example.com并替换域。