Javascript 量角器找不到角度

Javascript 量角器找不到角度,javascript,angularjs,selenium,jasmine,protractor,Javascript,Angularjs,Selenium,Jasmine,Protractor,我似乎无法让量角器意识到Angular正在加载和运行。当它打开Chrome时,我的应用程序会在浏览器中完全加载,因此我知道Angular已正确加载并运行 配置文件: exports.config = { seleniumServerJar: 'C:/Dev/PrismWeb/selenium/selenium-server-standalone-2.35.0.jar', seleniumPort: null, chromeDriver: 'C:/Dev/PrismWeb/selenium/c

我似乎无法让量角器意识到Angular正在加载和运行。当它打开Chrome时,我的应用程序会在浏览器中完全加载,因此我知道Angular已正确加载并运行

配置文件:

exports.config = {
seleniumServerJar: 'C:/Dev/PrismWeb/selenium/selenium-server-standalone-2.35.0.jar',

seleniumPort: null,

chromeDriver: 'C:/Dev/PrismWeb/selenium/chromedriver.exe',

seleniumArgs: [],

seleniumAddress: null,

allScriptsTimeout: 110000,

specs: ['c:/dev/prismweb/test/e2e/*.js'],

capabilities: {'browserName': 'chrome'},

baseUrl: 'http://localhost:8080',

rootElement: 'html',

jasmineNodeOpts: {
    onComplete: null,
    isVerbose: true,
    showColors: true,
    includeStackTrace: true,
    defaultTimeoutInterval: 30000
}
};
我只有一个测试,我正试图运行,它失败了,因为量角器无法找到角度

测试:

describe('homepage loads: ', function(){
var ptor;

    ptor = protractor.getInstance();

    beforeEach(function(){
        ptor.get('/');
    });

it('should load the prism homepage: ', function(){
    var usernameField = ptor.findElement(protractor.By.id("username"));
    //expect(usernameField).toBeDefined();
});
});
这是我得到的错误:

未知错误:javascript错误:未定义角度(会话 信息:chrome=30.0.1599.69)(驾驶员信息: chromedriver=2.2,平台=Windows NT 6.1 SP1 x86_64)(警告: 服务器未提供任何堆栈跟踪信息)命令持续时间或 超时:19毫秒生成信息:版本:“2.35.0”,版本: “c916b9d”,时间:'2013-08-12 15:42:01'系统信息:os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',java.version:'1.7.0_21' 会话ID:1EF7DCD7C5FC9C4E9E1DEDE50002ADF驱动程序信息: org.openqa.selenium.chrome.ChromeDriver功能[{platform=XP, acceptSslCerts=true,javascriptEnabled=true,browserName=chrome, chrome={chromedriverVersion=2.2},rotatable=false, locationContextEnabled=true,版本=30.0.1599.69, CSSSelectorEnabled=true,databaseEnabled=true,handlesAlerts=true, browserConnectionEnabled=false,WebStorage Enabled=true, nativeEvents=true,applicationCacheEnabled=false, takesScreenshot=true}]

我已经尝试将ng app属性移动到body标记(并相应地更改配置),但我得到了相同的错误。我们在html标记上也有一个ng控制器属性,我尝试将其移动到主体上,并将ng app属性单独保留在html标记上,但结果是相同的。有没有人知道为什么会失败

编辑: 只是一些可能有用的注释。我已经更新了上面的测试,以包括手动引导工作。Angular和所有模块的脚本标记位于页面底部,就在结束正文标记之前。HTML标记仍然具有ng app=“myApp”属性和ng controller=“baseController”属性。如果我尝试在测试中手动引导应用程序,我会得到以下结果:

ReferenceError: angular is not defined
另一件让我担心的事情是,我们使用的其中一个模块绝对需要将“$”映射到jQuery,因此我们将其映射如下:

<script type="text/javascript">
    var $jq=jQuery.noConflict();
    var $=jQuery.noConflict();
</script>

var$jq=jQuery.noConflict();
var$=jQuery.noConflict();
其中包括ng应用程序:

<!DOCTYPE html>
<html ng-app="prismApp" ng-controller="baseController">
<head>

我不太确定在,
it()
内做一个
beforeach()
,但除此之外,你试过等一会儿吗? 显然,我指的是
ptor.waitForAngular()
ptor.wait()

在您的
ptor.get()
之后尝试
ptor.sleep(10000)
,看看这是否是一个计时问题

编辑:还可以查看以及
wait()
的工作原理:

ptor.wait(function () {
  // Return a condition. Code will continue to run once it is true      
}, 10000); // Only do this for 10 seconds
编辑:尝试
ptor.driver.get('my-page')
而不是
ptor.get('my-page')


编辑:量角器现在将
浏览器
公开为全局文件,因此您可以只使用
browser.get('index.html#/foo')
browser.wait()
等。

您是否使用ng应用程序引导角度应用程序?还是手动引导应用程序

我在配置文件中看到,
rootElement
被设置为“html”


默认情况下,量角器假定应用程序的根将位于body标记上。如果
标记不是应用程序中的where angular bootstraps,请尝试将配置文件中的根元素更改为where angular first bootstraps(无论是手动还是使用ng app指令)。这确实有助于解决计时问题,并加快量角器的执行速度。

尝试将其包含在测试文件中:

browser.ignoreSynchronization = true;

它会关闭您的测试与angular的同步并使其正常工作。

加载angular时您是否自己进行引导?在测试中,不。我会尝试一下。不,您不需要自己进行引导-这只是问题的潜在原因。你能分享一下你的模板吗?加载ng应用程序的位置?ng应用程序位于HTML标记上(请参见上面的编辑)。模板只是HTML,在基本登录表单的按钮/字段上有几个ng-*属性。我们使用Bootstrap,但我不认为这会有什么不同。正如@Jmr所说,您不需要手动引导它。您确定服务器正在提供
angular.js
(或
angular.min.js
)文件吗?您的索引页是否包含在脚本中?当selenium将页面加载到浏览器中时,它似乎无法使用angular源代码…对于错误的测试感到抱歉。。。我已经改正了。但还是像以前一样跑。添加了sleep()之后,它现在安静地坐了10秒钟,然后我抛出了一个错误,其根源是它仍然找不到角度。我真的开始讨厌量角器了。我在手动引导应用程序时遇到了这个问题。你说你不是。我最终使用了
ptor.driver.get('my-page')
而不是
ptor.get('my-page')我更新了我的答案。我做了之后感觉很脏,但它确实有效。最终通过的测试套件如下所示:description('homepage loads:',function(){var ptor;ptor=gragraptor.getInstance();ptor.driver.get(“);it('should load the prism homepage:',function(){var usernameField=ptor.findelelement(grantor.By.id('username));expect(usernameField.getText()).toEqual(“;”); });谢谢你的帮助!两点:第一,这个问题已经提出9个多月了,量角器从那时起已经多次迭代;第二,我已经尝试过你的建议,但它不起作用。另外,对ng app属性的位置进行笼统的假设是错误的,因为Angular允许它在任何地方,但更喜欢它在e上它是HTML还是BODY。如果我把它设为BODY,那个么量角器就更好了