4

在我的index.html,我明确地说:角量角器:在浏览器环境中执行脚本

window.myAppInstance = new MyApp.myAppConstructor(); 

在我的待办事项-spec.js,我有以下设置:

describe('my web page', function() { 
    it('should have a "myAppInstance" object on the window', function() { 
    browser.get('https://my.web.page.com'); 

    function myTest() { 
     return Object.keys(window.myAppInstance).sort(); 
    }; 

    var p = browser.driver.executeScript(myTest); 
    p.then(function(ret) { 
     console.log("yay"); 
     console.log(ret); 
    }, function() { 
     console.log("error"); 
     console.log(arguments); 
    }); 
    }); 
}); 

但量角器没有找到我的应用程序。相反,它认为null或undefined:

error 
{ '0': 
    { [WebDriverError: unknown error: Cannot convert undefined or null to object 
(Session info: chrome=50.0.2661.102) 
... and more garbage 

但是,从Chrome的控制台,我可以运行

window.myAppInstance 

蛮好的,它正确地打印出的对象。

如何从我的量角器测试中访问此窗口对象?

编辑1:对构造函数更加明确。

编辑2:在我的应用程序中,我正在使用angular的manual bootstrapping。经进一步调查,我可以将此行添加到我的测试:

<snip> 
    browser.get('https://my.web.page.com'); 
    **browser.pause()** 
<snip> 

我现在步骤: 1)敲击F12带来了Chrome的开发者工具 2)看在控制台中。注意错误。我的应用崩溃了。 3)手动点击浏览器上的刷新按钮。 4)注意应用程序如何刷新,并且一切都很精美。在困惑中挠了挠头。结论是它可能以某种方式,与

browser.get('https://my.web.page.com'); 

程序启动页是从打开浏览器并输入该网址,打破它足够的不同。

我想知道现在,如何用量角器运行测试会导致我的应用程序失败?

回答

1

有可能是一个时间问题 - 值尚未公布,你可能需要等待它:

function waitForKey() { 
    return browser.executeScript("return window.myAppXXXXXXXXXXXXX"); 
} 

browser.wait(waitForKey, 5000); 
var p = browser.executeScript(myTest); 
// ... 
+0

感谢您的回答!听起来很有希望。当我回到我的电脑时,我会尝试。 – Bill

+0

有趣的是你应该使用动词'promise'。 – targumon

1

你的对象myAppXXXXXXXXXXXXX可能不是在执行myTest的时间还没有实例化。如果是这种情况,那么一种解决方案是调用executeAsyncScript,而不是在物体存在时返回对象的按键:

function myTest(callback){ 
    if (window.myAppXXXXXXXXXXXXX) { 
    callback(Object.keys(window.myAppXXXXXXXXXXXXX).sort()); 
    } else { 
    setTimeout(myTest, 30); // try again in 30ms 
    } 
} 

browser.driver.executeAsyncScript(myTest) 
    .then(function(ret) { 
    console.log("yay"); 
    console.log(ret); 
    }, function() { 
    console.log("error"); 
    console.log(arguments); 
    }); 
+0

感谢您的回答!听起来很有希望。当我回到我的电脑时,我会尝试。 – Bill

相关问题