失败:30009ms后等待超时

时间:2017-10-05 08:25:47

标签: protractor

config.js

exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',

specs: [
    'Login.js',
    'FeatureList.js',
    'NewApplicationRegistration.js',
    'ApplicationRegistrationManagement.js',
    'RegistrationStatus.js',
],
baseUrl: 'http://localhost:3000',
multiCapabilities: [{
    'browserName': 'chrome'
},
    // {
    //     'browserName': 'firefox'
    // }, 
    // {
    //     'browserName': 'internet explorer'
    // }
],
jasmineNodeOpts: {
    onComplete: null,
    isVerbose: false,
    showColors: true,
    includeStackTrace: true,
    defaultTimeoutInterval: 3000000
},
allScriptsTimeout: 11000,
rootElement: 'html',
onPrepare: function () {
    browser.ignoreSynchronization = true;
    browser.driver.manage().window();
},
};

第一个规范文件

'use strict'

describe('Application Registration Page', function () {

beforeEach(function () {
    browser.waitForAngular();
    browser.get('/register');
});

// Login
it('Test for Login', function () {
    expect(element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[1]/th/label')));
    var EC = protractor.ExpectedConditions;
    var username = element(by.id('login-username'));
    browser.wait(EC.visibilityOf(username), 30000);
    username.sendKeys('sss');

    expect(element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[2]/th/label')));
    var EC = protractor.ExpectedConditions;
    var password = element(by.id('login-password'));
    browser.wait(EC.visibilityOf(password), 30000);
    password.sendKeys('sss');

    browser.driver.sleep(1000);

    element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[3]/td/button')).click().then(function (username, password) {
        if (username, password) {
            browser.navigateTo('http://localhost:3000/register/core/feature-list');
        } else {
            expect(browser.isElementPresent(element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[1]/td/b'))));
        }
    });
});
});

第二条规范

'use strict'

describe('Welcome to feature list', function () {

beforeEach(function () {
    browser.waitForAngular();
    browser.get('/register/core/feature-list');
});


describe('Header', function () {

    // Application Registration text
    it('Test for Application Registration text', function () {
        var EC = protractor.ExpectedConditions;
        var ar = element(by.xpath('/html/body/admin-app-root/layout/div[1]/c-header/nav/div/div[1]/a[2]'));
        browser.wait(EC.presenceOf(ar), 2000000);
        expect(ar.getAttribute('value')).toEqual('Application Registration');
    });


    it('Test for user name', function () {
        var EC = protractor.ExpectedConditions;
        var username = element(by.xpath('//*[@id="cox-navbar"]/ul/li[1]/a'));
        browser.wait(EC.visibilityOf(username), 2000);
        expect(username.isPresent()).toBe(true);
    });     
});

第一个规范脚本运行正常,但运行第二个规范我收到错误说:

  

2000000ms后等待超时

即使脚本超时非常大,也会出现错误。对于给定的时间,它无法从浏览器中找到元素。

帮我找到解决方案。

2 个答案:

答案 0 :(得分:0)

非常简短的答案:让你的量角器工作而不使用ignoreSynchronization来避免这些问题。我将在下面详细说明您的问题,从您明确提出的问题开始。

在第二个规范上获得超时的原因

  

EC.presencesOf()隐式调用waitForAngular read more about it here

因为您ignoreSynchronization = true调用了waitForAngular次(因为您忽略了AngularSynchronization量角器无法识别presenceOf对象)。因为你间接称它为超时。

如果您在不知道其后果的情况下使用ignoreSynchronization,那就没有意义了。原因非常有限,为什么要使用它。

您的第一个规范没有ignoreSynchronization

的问题

鉴于您的XPath查询,对我来说,Angular-Root-Element似乎不是body,而是admin-app-root。因此,请尝试将rootElement: body中的config.ts更改为rootElement: admin-app-root。 (作为一个可能的根本原因,为什么你的量角器不能很好地适应你正在测试的Angular页面。)

配置调整后:如果您仍然获得超时或缺少可测试性,请进一步check this answer

同时降低timeout元素的ar 2000000。我认为,这么长的超时几乎永远不会有意义,因为之前许多其他超时(web-timeout,jasmine-timeout,进一步的webdriver-timeouts等)。

更多建议和信息

  1. global.EC = protractor.ExpectedConditions;放入onPrepare:的{​​{1}}部分,因此您无需将其添加到每个测试用例中。
  2. 添加一个承诺到conf.js部分的步骤,否则您的测试可能会提前开始(请参阅this documentationa simple example here
  3. 避免使用XPath-Selectors,因为它们很慢且难以维护(任何添加的div或移动的形式......基本上任何UI设计修改都可能让您的测试失败)。请改用Angular-Model或CSS-Selectors(learn about it here)。
  4. 作为onPrepare:命令不会创建承诺,您应该在browser.get()部分放置browser.waitForAngular()以确保您的测试仅在您的网页完全加载后开始。
  5. 仅使用beforeEach,如果您知道自己测试了需要它的特定情况。例如,如果您在加载过程中明确尝试验证某些内容,那么在处理异步任务时(即测试阻塞元素的外观)。 Learn about the purpose of ignoreSynchronization here
  6. 如果您的量角器无法与您的角度页面或您的测试同步,则非角度页面会使用ignoreSynchronization。如果您处理Angular页面,首先尝试调试Protractor无法同步的原因。 Learn about these possibilities here

答案 1 :(得分:0)

@amit尝试在before之前使用promise,如下所示:

beforeEach(function () {
    browser.waitForAngular().then(funtion(){
      return browser.get('/register/core/feature-list');
    }).then(function(){
       console.log(browser.getCurrentUrl()) // ensure you are on correct url 
    })
});

它应该有用。