黄瓜量角器-错误:函数在50000毫秒后超时

时间:2019-02-22 09:20:24

标签: javascript selenium protractor cucumber

我正在使用黄瓜和量角器来测试我的应用程序。我必须连接到Web应用程序并完成创建部分活动的完整过程,但是完成“给出我在交互部分中查找它之后单击secID的操作”之后,浏览器将等待几秒钟,然后关闭。我有这个错误:

 × When I edit the sec options after the click on the Activitytab # ..\stepDefinitions\firstTask\feat1_stepUno.js:108
   Error: function timed out after 50000 milliseconds
       at Timeout._onTimeout 
       at listOnTimeout (timers.js:327:15)
       at processTimers (timers.js:271:5)

我该如何处理?

这是我的步骤定义:

import { browser } from 'protractor';
//var browser = require("protractor");
//var Given, When, Then = require("cucumber");
import { Given, When, Then } from "cucumber";
//var Given = require("cucumber");
//var When = require("cucumber");
//var Then = require("cucumber");
var Globals = require("../../support/Globals");
//import Globals from '../../../support/Globals';
//import { Given, When, Then } from "cucumber";

// Chai
//const globals = new Globals();
//const expect = globals.expect;
//const assert = globals.assert;
var chai = require('chai');
chai.should();

function getArrPath(){
    var path = document.location.href;
    console.log("path",path);
    var urlArray = path.split('/');
    console.log("urlArray",urlArray[3]);
    return urlArray;
}

var until = protractor.ExpectedConditions;

Given('I am a logged user', function (next) {
    browser.get('http://www.mytestsite.com');
    browser.sleep(5000);
    let username_class = element(by.css('.UsernameIn'));
    username_class.sendKeys('testUser');
    let pwd_class = element(by.css('.PasswordIn'));
    pwd_class.sendKeys('testPass');
    let login_button = element(by.css('.LoginButtons'));
    login_button.click();
    browser.sleep(9000);
    next();
});

Given('the new sec has been created successfully',{timeout:120*1000}, function (next) {
    let interaction = element(by.id('myInteractionID'));
    browser.wait(until.presenceOf(interaction), 1200000, 'Element taking too long to appear in the DOM');
    interaction.click();
    browser.sleep(9000);
    let create_tab = element(by.id('mycreateID'));
    browser.wait(until.presenceOf(create_tab), 1200000, 'Element taking too long to appear in the DOM');
    create_tab.click();
    browser.sleep(9000);
    var x = 10;
    var y = 99;
    let mandatory_name = element(by.id('myMandatoryNameID'));
    browser.wait(until.presenceOf(mandatory_name), 1200000, 'Element taking too long to appear in the DOM');
    mandatory_name.sendKeys('VV1'+(Math.floor(Math.random() * ((y-x)+1) + x)));
    let mandatory_secID = element(by.id('MyMandatorySecID'));
    browser.wait(until.presenceOf(mandatory_secID), 1200000, 'Element taking too long to appear in the DOM');
    mandatory_secID.sendKeys('VV1'+(Math.floor(Math.random() * ((y-x)+1) + x)));
    let eff_date = element(by.id('myEffDateID'));
    eff_date.click();
    browser.sleep(4000);
    let selected_date = element(by.css('.xoDate'));
    browser.wait(until.presenceOf(selected_date), 1200000, 'Element taking too long to appear in the DOM');
    selected_date.click();
    let save_and_continue = element(by.id('mySaveID'));
    save_and_continue.click();
    browser.sleep(3000);    
    let sec_name = element(by.xpath("//span[contains(text(), 'VV1')]"));
    browser.wait(until.presenceOf(sec_name), 1200000, 'Element taking too long to appear in the DOM');
    sec_name .getText().then(function(text){
        console.log('sec_name  = ', text);
        expect(text).to.include('VV1');
        next();
    })
});



Given('I clicked on the secID after looking it for on the interaction section',{timeout:120*1000}, function (next) {
    let secIDCreated = element.all(by.css(".createdClass")).get(0);
        secIDCreated.getText().then(function(created_id){
        console.log('sec name = ', created_id);
        let created_sec = created_id;
        let new_inter = element(by.id('myInterID'));
        browser.wait(until.presenceOf(new_inter), 1200000, 'Element taking too long to appear in the DOM');
        new_inter.click();
        browser.sleep(5000);
        let search_tab = element(by.id('mySearchID'));
        browser.wait(until.presenceOf(search_tab), 1200000, 'Element taking too long to appear in the DOM');
        search_tab.clear().sendKeys(created_sec);
        browser.sleep(5000);
        let search_del_name = element(by.id('mySearchNameID'));
        browser.wait(until.presenceOf(search_del_name), 1200000, 'Element taking too long to appear in the DOM');
        search_del_name.clear();
        let search_del_date = element(by.id('mySearchDateID'));
        search_del_date.clear();
        browser.sleep(5000);
        let search_button = element(by.id('mySearchButtonID'));
        search_button.click();
        browser.sleep(3000);
        let sec_id_inter = element.all(by.css(".interIdClass")).get(0);
        browser.wait(until.presenceOf(sec_id_inter), 1200000, 'Element taking too long to appear in the DOM');
        sec_id_inter.click();
        next();
    })
})

When('I edit the sec options after the click on the Activitytab', {timeout: 50*1000},function (next) {
    let activity = element(by.id('myActivityID'));
    browser.wait(until.presenceOf(activity), 1200000, 'Element taking too long to appear in the DOM');
    activity.click();
    browser.sleep(4000);
    let secID_sec = element(by.xpath("//span[contains(text(), 'SEC_Creation')]"));
    browser.wait(until.presenceOf(secID_sec), 1200000, 'Element taking too long to appear in the DOM');
    secID_sec.click();
    browser.sleep(4000);
    let allocator_button = element(by.id('myAllocatorID'));
    allocator_button.click();
    browser.sleep(4000);
    let edit_button = element(by.id('myEditID'));
    edit_button.click();
    browser.sleep(5000);
    let data_compl = element(by.id('myDateComplID'));
    browser.wait(until.presenceOf(data_compl), 1200000, 'Element taking too long to appear in the DOM');
    data_compl.click();
    browser.sleep(4000);
    let selected_date = element(by.css('.selectedClass'));
    browser.wait(until.presenceOf(selected_date), 1200000, 'Element taking too long to appear in the DOM');
    selected_date.click();
    let complete_manual = element(by.id('myManualID'));
    complete_manual.click();
    let ok_selection = element(by.css('option[value="2"]'));
    ok_selection.click();
    let save_button = element(by.id('saveButtonID'));
    save_button.click();
    browser.sleep(3000);
    let custom = element.all(by.css('.customObClass')).get(2);
    browser.wait(until.presenceOf(custom), 1200000, 'Element taking too long to appear in the DOM');
    expect(custom.isPresent()).to.eventually.be.true.and.notify(next);
});

When('I filled all the mandatory fields of the related custom object', {timeout:120*1000}, function (next) {
     let custom = element.all(by.css('.x221')).get(2);
     browser.wait(until.presenceOf(custom), 1200000, 'Element taking too long to appear in the DOM');
     custom.click();
     browser.sleep(5000);
     let editor = element(by.id('myEditorId'));
     editor.click();
     browser.sleep(5000);
     let class_sec = element(by.id('MySecIDClass'));
     browser.wait(until.presenceOf(class_sec), 1200000, 'Element taking too long to appear in the DOM');
     class_sec.click();
     let class_sel = element(by.css('option[value="2"]'));
     browser.wait(until.presenceOf(class_sel), 1200000, 'Element taking too long to appear in the DOM');
     class_sel.click();
     let longitude = element(by.id('myLongitudeID'));
     browser.wait(until.presenceOf(longitude), 1200000, 'Element taking too long to appear in the DOM');
     longitude.sendKeys('12');
     let latitude = element(by.id('myLatitudeID'));
     browser.wait(until.presenceOf(latitude), 1200000, 'Element taking too long to appear in the DOM');
     latitude.sendKeys('21');
     let area_custom = element(by.id('myCustomAreaID'));
     browser.wait(until.presenceOf(area_custom), 1200000, 'Element taking too long to appear in the DOM');
     area_custom.click();
     let area_sel = element(by.css('option[value="1"]'));
     browser.wait(until.presenceOf(area_sel), 1200000, 'Element taking too long to appear in the DOM');
     area_sel.click();
     let tipology = element(by.id('myTipologyID'));
     browser.wait(until.presenceOf(tipology), 1200000, 'Element taking too long to appear in the DOM');
     tipology.click();
     let tipology_sel = element(by.css('option[value="1"]'));
     browser.wait(until.presenceOf(tipology_sel), 1200000, 'Element taking too long to appear in the DOM');
     tipology_sel.click();
     let save_and_close = element(by.id('mySaveCloseID'));
     browser.wait(until.presenceOf(save_and_close), 1200000, 'Element taking too long to appear in the DOM');
     save_and_close.click();
     browser.sleep(3000);
     next();
});

Then('I want the first manual task created properly in the activity details section', {timeout: 120*1000}, function (next) {
     let pending_install = element.all(by.css('.pendingClass')).get(0);
     browser.wait(until.presenceOf(pending_install), 1200000, 'Element taking too long to appear in the DOM');
     pending_install.click();
     browser.sleep(5000);
     let activity_ret = element(by.id('retroActivityID'));
     browser.wait(until.presenceOf(activity_ret), 1200000, 'Element taking too long to appear in the DOM');
     activity_ret.click();
     browser.sleep(4000);
     let secID_sec = element(by.xpath("//span[contains(text(), 'SEC_Creation')]"));
     browser.wait(until.presenceOf(secID_sec), 1200000, 'Element taking too long to appear in the DOM');
     secID_sec.click();
     browser.sleep(5000);
     let complete_button = element(by.id('completeID'));
     browser.wait(until.presenceOf(secID_sec), 1200000, 'Element taking too long to appear in the DOM');
     complete_button.click();
     let related_business = element(by.id('businessID'));
     browser.wait(until.presenceOf(related_business), 1200000, 'Element taking too long to appear in the DOM');
     related_business.click();
     browser.sleep(5000);
     browser.wait(until.presenceOf(activity_ret), 1200000, 'Element taking too long to appear in the DOM');
     activity_ret.click();
     browser.sleep(4000);
     let first_Task = element(by.css('tr[class="firstTask"]'));
     browser.wait(until.presenceOf(first_Task), 1200000, 'Element taking too long to appear in the DOM');
     expect(first_Task.isPresent()).to.eventually.be.true.and.notify(next);
});

Hooks.js:

import { browser } from 'protractor';

"use strict";

const { BeforeAll, Before, After, Status } = require("cucumber");
const conf = require("../config/firstTask.config").config;

    BeforeAll({timeout: 100 * 1000}, function() {
      return browser.get(conf.baseUrl);
      browser.executeScript('window.localStorage.clear();');
      browser.executeScript('window.sessionStorage.clear();');
      browser.driver.manage().deleteAllCookies(); 
    });


    After(function(scenario) {
      //browser.executeScript('window.sessionStorage.clear();');
      //browser.executeScript('window.localStorage.clear();');
      if (scenario.result.status === Status.FAILED) {
        const attach = this.attach; // cucumber's world object has attach function which should be used
        return browser.takeScreenshot().then(function(png) {
          const decodedImage = new Buffer(png, "base64");
          return attach(decodedImage, "image/png");
        });
      }
    });

config.js

const path = require("path");
const jsonReports = process.cwd() + "/reports/json";
const Reporter = require("../support/reporter_firstTask/reporter");

exports.config = {
  ignoreUncaughtExceptions: true,
  seleniumAddress: "http://localhost:4444/wd/hub",
  getPageTimeout: 60000,
  allScriptsTimeout: 500000,
  capabilities: {
    browserName: process.env.TEST_BROWSER_NAME || "chrome",
    'chromeOptions': {
     //'args': ['--user-data-dir=~/.e2e-chrome-profile'],
      'args': ['--disable-web-security', '--user-data-dir=~/.e2e-chrome-profile']
    }
  },
  framework: "custom",
  frameworkPath: require.resolve("protractor-cucumber-framework"),
  specs: ["../features/firstTask/*.feature"],
  // resultJsonOutputFile: "./reports/json/protractor_report.json",
  onPrepare: function() {
    var chai = require('chai');
    chaiAsPromised = require('chai-as-promised');
    chai.use(chaiAsPromised);
    chai.should();
    global.expect = chai.expect;
    browser.ignoreSynchronization = true;
    browser.manage().window().maximize();
    require('babel-register');
    Reporter.createDirectory(jsonReports);
  },
  cucumberOpts: {
    //strict: true,
    format: 'json:./reports/json/cucumber_report.json',
    require: ["../stepDefinitions/firstTask/*.js"],
    tags: "(@FirstTask1Step1)"
      },
  onComplete: function () {
    Reporter.createHTMLReport();
  }
};

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以在hook.js中为每个步骤函数的执行持续时间设置全局超时,如下所示:

const { BeforeAll, Before, After, Status, setDefaultTimeout} = require("cucumber");

setDefaultTimeout(120 * 1000) // 120 seconds timeout for each step function

BeforeAll({timeout: 100 * 1000}, function() { ...

然后,您无需在每个步骤功能中都使用{timeout: 50*1000},除非特殊步骤需要比全局超时更多的时间。