我试图测试网站的新功能。这是迄今为止在React中构建的唯一页面。当我尝试使用PhantomJS在Selenium中运行测试时,页面索引会加载,但整页加载永远不会触发。
页面正文为:
<body>
<main id="content"></main>
<script type="text/javascript">
function loadBundleJS( jsSource){
var bundleJSScriptTag=document.createElement('script')
bundleJSScriptTag.setAttribute("type","text/javascript")
bundleJSScriptTag.setAttribute("src", jsSource)
if (typeof bundleJSScriptTag != 'undefined'){
document.getElementsByTagName('head')[0].appendChild(bundleJSScriptTag);
}
}
var paramsArray = window.location.search.substring(1).split("&");
Object.keys(paramsArray).forEach(function(key){
var param = paramsArray[key];
if (param.indexOf("/")>-1){
param = param.substring(0, param.indexOf("/"))
}
})
loadBundleJS('js/bundle.0.0.2.js')
</script>
</body>
当网站在浏览器中运行时,内容将附加到主标记。但是,在PhantomJS中,此内容永远不会被追加,PhantomJS会加载一个空白页面。
答案 0 :(得分:1)
问题不在您的代码中,在PhantomJS运行的WebKit浏览器中。 PhantomJS运行旧版本的WebKit引擎,该引擎使用较旧版本的ECMAScript。
ReactJS使用ECMAScript 5中的 Function.bind 方法
解决方案非常简单,如果不存在,则需要在代码中定义Function.prototype.bind。
**确保之前加载代码包括react.js。
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== 'function') {
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
if (this.prototype) {
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
return fBound;
};
}
代码取自:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind#Polyfill