问题描述
我正在使用量角器&黄瓜框架。
I am automating an angular 4 application with protractor & cucumber framework.
单击简单按钮会出错。 (并非始终如此)
Getting error for a simple button click. (Not all the times)
1) Scenario: Scenario 2 - features\Home.feature:9
Step: Then Click on edit button - features\Home.feature:11
Step Definition: stepDefinitions\FirstStep.ts:31
Message:
Error: function timed out after 5000 milliseconds
at Timeout.<anonymous> (C:\MyWorkspace\protractor-cucumber-final\protractor-cucumber-final\node_modules\cucumber\lib\user_code_runner.js:91:22)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)
我相信无需设置等待时间,因为量角器足够智能,可以解决承诺
Checked here I believe no need to set wait times as protractor is intelligent enough to resolve promises
我的项目详细信息如下:
my project details as follows:
节点:v6.10.3
量角器:v5.1.2
Node: v6.10.3protractor: v5.1.2
StepDefinition.ts:
let homePage = new HomePage();
Then(/^Click on edit button$/, async () => {
await homePage.clickEditButton();
});
HomePage.ts:
async clickEditButton() {
console.log('clicking on Edit Button');
await this.editButton.click();
}
package.json (部分)
"main": "index.js",
"scripts": {
"test": "protractor config/config.js",
"webdriver-start": "webdriver-manager start",
"webdriver-update": "webdriver-manager update"
},
"dependencies": {
"chai": "^4.0.2",
"cucumber": "^2.3.0",
"mkdirp": "^0.5.1",
"protractor": "^5.1.1",
"protractor-cucumber-framework": "^3.1.0"
},
"devDependencies": {
"chai-as-promised": "^6.0.0",
"cucumber-html-report": "^0.6.0",
"cucumber-html-reporter": "^0.5.2",
"cucumberjs-allure-reporter": "^1.0.3",
"pg": "^6.0.3"
}
config.js
var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
exports.config = {
seleniumAddress: "http://localhost:4444/wd/hub",
baseUrl: "http://localhost:4200/",
framework: "custom",
frameworkPath: require.resolve("protractor-cucumber-framework"),
specs: ["../features/*.feature"],
exclude: "../features/database.feature",
resultJsonOutputFile: "./reports/json/protractor_report.json",
onPrepare: function() {
// browser.ignoreSynchronization = true;
browser.manage().window().maximize();
global.expect = chai.expect;
},
cucumberOpts: {
strict: true,
format: ["pretty"],
require: ["../stepDefinitions/*.js", "../support/*.js"],
tags: "@micro"
}
};
预先感谢
17年8月28日更新:
ManageRecipeStep.ts
ManageRecipeStep.ts
import {defineSupportCode} from 'cucumber';
import {ManageRecipePage} from "../pages/ManageRecipePage";
var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
let expect = chai.expect;
Then(/^Cancel button should be displayed$/, async () => {
await expect(manageRecipePage.getCancelButton()).to.eventually.equal('Cancel');
});
ManageRecipePage.ts
ManageRecipePage.ts
import {ActionUtil} from "../utils/ActionUtil";
import {BasePage, IdentificationType} from "../utils/BasePage";
const Locators = {
cancelByText: {
type:IdentificationType[IdentificationType.PartialButtonText],
value: "Cancel"
}
};
let actionUtil = new ActionUtil();
export class ManageRecipePage extends BasePage {
async getCancelButton() {
await actionUtil.getElementText(Locators.cancelByText);
}
}
ActionUtil.ts
ActionUtil.ts
import {BasePage} from "./BasePage";
export class ActionUtil {
private basePage: BasePage = new BasePage();
async getElementText(obj) {
let attempts = 0;
while(attempts < 2) {
try {
return await this.basePage.ElementLocator(obj).getText();
} catch(StaleElementException) {
console.log("EXCEPTION while getting Text" + StaleElementException);
}
attempts++;
}
return null; // todo: this case
}
BasePage.ts
BasePage.ts
import { browser, element, by, protractor, $$, $ } from 'protractor';
export enum IdentificationType {
Xpath,
Css,
Id,
Js,
Name,
PartialLinkText,
ClassName,
PartialButtonText
}
export class BasePage {
ElementLocator(obj) {
switch (obj.type) {
case IdentificationType[IdentificationType.Xpath]:
return element(by.xpath(obj.value));
case IdentificationType[IdentificationType.ClassName]:
return element(by.className(obj.value));
case IdentificationType[IdentificationType.Id]:
return element(by.id(obj.value));
case IdentificationType[IdentificationType.Js]:
return element(by.js(obj.value));
case IdentificationType[IdentificationType.Css]:
return element(by.css(obj.value));
case IdentificationType[IdentificationType.PartialButtonText]:
return element(by.partialButtonText(obj.value));
default:
break;
}
}
}
推荐答案
黄瓜的默认超时为5秒。 (至10秒)为我工作。 。此问题可能是因为应用程序已关闭。
Default timeout for cucumber is 5 sec. Setting default time (to 10 sec) worked for me. Example is here. This issue might be because application is down.
@quirimmo感谢您的支持。
@quirimmo Thanks for your support.
这篇关于函数在5000毫秒后超时-角度4-量角器&黄瓜的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!