2017-08-24 8 views
1

キュウリのフレームワークで角度4のアプリケーションを自動化しています&関数は5000ミリ秒後にタイムアウトしました - 角4 - 分度器&キュウ

ボタンをクリックするだけでエラーになる。 (すべてではない回は)

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私は分度器は次のように

私のプロジェクトの詳細約束を解決するのに十分なインテリジェントであるとして時間を待つ設定する必要を信じていない:

ノード:v6.10.3 分度器: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" 
    } 
}; 

おかげで

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

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); 
    } 
} 
:28-Aug'17を更新し

を進めます

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

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

答えて

0

キュウリのデフォルトタイムアウトは5秒です。 Setting default time(〜10秒)は私のために働いた。 Example is here。この問題は、アプリケーションがダウンしている可能性があります。

@quirimmoご支援いただきありがとうございます。 、私は私のhooks.tsでprotractor.conf.jsで

SELENIUM_PROMISE_MANAGER: true, 

を使用しています私にとっては

1

2つのこと:

1)async/awaitと分度器を使用している場合WebDriver Control Flowを無効にしてください次のコマンドを介してconfigにD:

ここ
SELENIUM_PROMISE_MANAGER: false 

公式ドキュメントからプロパティのスペック:

webdriverを制御フローを有効/無効にします。 WebDriverJS(拡張モジュール)は、制御フローを使用して コマンドの実行順序を管理し、約束は となります(詳細はdocs/control-flow.mdを参照)。導入されているasync/awaitのような構文として はしかし、WebDriverJSは は、制御フローを廃止することを決めた、とユーザーが自分自身(ここでは詳細: https://github.com/SeleniumHQ/selenium/issues/2969) 非同期の活動を管理しています。 現在、WebDriver Control Flowはデフォルトで有効になっています。 を無効にするには、環境変数 SELENIUM_PROMISE_MANAGER0に設定します。 Q4の 2017のウェブドライバリリースでは、デフォルトでコントロールフローが無効になりますが、SELENIUM_PROMISE_MANAGER1に設定すると、 を再度有効にすることができます。後で、制御フローは のために削除されます。環境変数の管理が嫌いな場合は、 が設定ファイルにこのオプションを設定でき、分度器は によって制御フローの有効/無効を処理します。この オプションを設定するのは、環境変数SELENIUM_PROMISE_MANAGER よりも優先されます。 @type {ブール=}

2)あなたは、ノード6.10.3がasync/awaitをサポートしていることを確認していますか? async/awaitの正式なデフォルトサポートはノード7.6以降です。

+0

コメントAR延長議論のためではない。この会話は[チャットでアーカイブされました](http://chat.stackoverflow.com/rooms/153004/discussion-on-answer-by-quirimmo-function-timed-out-after-5000-milliseconds-an)。 –

0

は、(私は待つ/非同期を使用していない)、私はこれらのいずれかが必要です。ここで

BeforeAll({ timeout: 60 * 1000 },() => { 
     setDefaultTimeout(60 * 1000); 
     return browser.get(config.baseUrl); 
    }); 


    BeforeAll({ timeout: 60 * 1000 },() => { 
     defineSupportCode(({ setDefaultTimeout }) => { 
     setDefaultTimeout(60 * 1000); 
     }); 
     return browser.get(config.baseUrl); 
    }); 

は私のインポートです:

import { Before, After, BeforeAll, defineSupportCode, Status, setDefaultTimeout } from 'cucumber'; 
関連する問題