【问题标题】:Protractor fails to find Angular量角器找不到 Angular
【发布时间】:2013-10-23 21:10:54
【问题描述】:

我似乎无法让 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/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
}
};

我只有一个尝试运行的测试,但它失败了,因为 Protractor 找不到 Angular。

测试:

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();
});
});

这是我得到的错误:

UnknownError:javascript 错误:未定义角度(会话 信息:铬=30.0.1599.69)(驱动程序信息: chromedriver=2.2,platform=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:1ef7dcd7c5fc9c4e9e1dede050002adf 驱动程序信息: org.openqa.selenium.chrome.ChromeDriver 功能 [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, 铬={chromedriverVersion=2.2},可旋转=假, locationContextEnabled=true,版本=30.0.1599.69, cssSelectorsEnabled=true,databaseEnabled=true,handlesAlerts=true, browserConnectionEnabled=false,webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takeScreenshot=true}]

我尝试将 ng-app 属性移动到 body 标记(并相应地更改配置),但我得到了同样的错误。我们在 html 标记上也有一个 ng-controller 属性,我尝试将它移到正文中,并在 html 标记上单独保留 ng-app 属性,但结果是一样的。有人知道为什么会失败吗?

编辑: 只是一些可能会有所帮助的注释。我已经更新了上面的测试以包括手动引导工作。 Angular 的脚本标签和所有模块都位于页面底部,就在结束 BODY 标签之前。 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>

ng-app 包含在哪里:

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

【问题讨论】:

  • 在加载 Angular 时,您是否自己进行引导?
  • 在测试中,没有。我会试一试。
  • 不,您不需要自己进行引导 - 这只是问题的潜在原因。你能分享你的模板的sn-p吗? ng-app 在哪里加载?
  • ng-app 位于 HTML 标记上(参见我上面的编辑。)模板只是 HTML,在基本登录表单中的按钮/字段上具有几个 ng-* 属性。我们使用 Bootstrap,但我不明白这会有什么不同。
  • 正如@Jmr 所说,您不需要手动引导它。您确定您的服务器正在提供angular.js(或angular.min.js)文件吗?并且您的索引页面将其包含在脚本中?将页面加载到浏览器中时,selenium 似乎无法使用角度源代码......

标签: javascript angularjs selenium jasmine protractor


【解决方案1】:

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

browser.ignoreSynchronization = true;

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

【讨论】:

    【解决方案2】:

    您是否使用 ng-app 来引导您的 Angular 应用程序?还是您手动引导您的应用程序?

    我在您的配置文件中看到rootElement 设置为“html”。

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

    【讨论】:

    • 两点:第一,这个问题有9个多月了,从那时起Protractor已经迭代了很多次;其次,我已经尝试过您的建议,但没有奏效。此外,对 ng-app 属性的位置做出笼统的假设是错误的,因为 Angular 允许它出现在任何地方,但更喜欢它位于 HTML 或 BODY 上。如果我将它设置为 BODY,那么量角器最好在那里寻找它,如果找到它就使用它。就我而言,这并没有发生。
    【解决方案3】:

    我不太确定在it() 中执行beforeEach(),但除此之外,您是否尝试过等待一段时间? 显然,我的意思是ptor.waitForAngular()ptor.wait()

    ptor.get() 之后尝试ptor.sleep(10000),看看它是否是一个时间问题。

    编辑:还请查看protractor api 以及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');

    编辑:Protractor 现在将browser 公开为全局,因此您可以使用browser.get('index.html#/foo')browser.wait() 等。

    【讨论】:

    • 抱歉测试不好...我已经纠正了。虽然仍然像以前一样运行。随着 sleep() 的添加,它现在安静地等待 10 秒,然后我得到一个抛出错误,其根源是它仍然找不到 Angular。我真的开始讨厌量角器了。
    • 我在手动引导应用程序时遇到了这个问题。你说你不是。我最终使用ptor.driver.get('my-page'); 而不是ptor.get('my-page'); 我更新了我的答案。
    • 我觉得这样做很脏,但它确实有效。最终的 PASSING 测试套件如下所示: describe('homepage loading: ', function(){ var ptor; ptor = protractor.getInstance(); ptor.driver.get("prism:8080/index.html"); it('应该加载棱镜homepage: ', function(){ var usernameField = ptor.findElement(protractor.By.id("username")); expect(usernameField.getText()).toEqual(""); }); }); 谢谢你的帮助!
    猜你喜欢
    • 2019-07-09
    • 2015-01-31
    • 1970-01-01
    • 2019-03-08
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多