2017-08-24 52 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" 
    } 
}; 

感謝推進

修訂版28 Aug'17:

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

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

回答

1

兩件事情:

1)請務必在使用量角器與async/await時禁用WebDriver Control Flow通過以下指揮官d在配置:

SELENIUM_PROMISE_MANAGER: false 

這裏的財產從官方文檔規範:

啓用/禁用webdriver的控制流。 WebDriverJS(以及擴展,量角器)使用控制流程來管理命令執行的順序,並且承諾解決了 (詳情請參閱docs/control-flow.md)。 然而,由於語法像async/await正在引入,WebDriverJS有 決定棄用控制流程,並讓用戶(瞭解詳情: https://github.com/SeleniumHQ/selenium/issues/2969)管理 異步活動本身。 目前,默認情況下,WebDriver控制流仍處於啓用狀態。您可以通過將環境變量 SELENIUM_PROMISE_MANAGER設置爲0來禁用它。在Q4 2017的webdriver發行版中,默認情況下,控制流程將被禁用,但您將通過SELENIUM_PROMISE_MANAGER設置爲 1而使 可以重新啓用。稍後,控制流程將被移除,對於 好。如果你不喜歡管理環境變量, 可以在你的配置文件中設置這個選項,量角器將 爲你啓用/禁用控制流。設置此 選項的優先級高於環境變量的SELENIUM_PROMISE_MANAGER 。 @type {布爾=}

2)你肯定節點6.10.3支持async/await?我記得async/await的官方默認支持是自從節點7.6

+0

評論AR e不適合長時間討論;這個對話已經[在聊天中存檔](http://chat.stackoverflow.com/rooms/153004/discussion-on-answer-by-quirimmo-function-timed-out-after-5000-milliseconds-an)。 –

0

對我來說,(我沒有使用異步/等待),我使用

SELENIUM_PROMISE_MANAGER: true, 
在protractor.conf.js

在我hooks.ts,我需要的兩者之一:

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'; 
相關問題