2017-02-08 5 views
2

Имейте этот метод испытание объекта на Protractor страницы:jasmine.Promise против webdriver.promise.Promise

public navigateTo =(): Promise<any> => { 
    return browser.get('https://material.angular.io/'); 
}; 

Хочет, чтобы определить тип, который возвращается, т.е. Promise<any>.

Должен ли я импортировать обещание jasmine? Или обещание webdriver?

import * as webdriver from "selenium-webdriver"; 
import Promise = webdriver.promise.Promise; 

или

import Promise = jasmine.Promise; 

Я смущен о том, почему я должен указать выполнение обещания. Могу ли я указать интерфейс для Promise?


редактировать: То, что я действительно хотел сделать, это:

npm install --save-dev @types/es6-promise 

Это дало мне Promise<any> типа.

Соответствующий вопрос: How to use Typescript with native ES6 Promises

+1

В чем проблема с ES6 Promise и почему вы не используете его вместо этого? – smnbbrv

+0

Я получаю 'TSError: Невозможно скомпилировать TypeScript practice.e2e-spec.ts: Не могу найти имя 'Promise'' Так что, возможно, я могу использовать обещание ES6, но у меня нет типа для него? –

ответ

2

Импорт webdriver.promise.Promise

Большинство вызовов API в селен-WebDriver возвращают webdriver.promise.Promise. Эти обещания выполняются в порядке потока управления. Недавно они перешли от своей реализации обещаний к собственным обещаниям в стиле ES6.

Вам нужно импортировать webdriver.promise.Promise в свой тест-протрактор? Возможно нет.

Импорт jasmine.Promise

jasmine.Promise не приходит от типизации жасмин, но это происходит от jasminewd2 типизации. Это помощник, позволяющий работать с остальными типом. Если вы импортируете jasmine.Promise в свой тест? Абсолютно нет.

транспортир появляется синхронное

Мой аргумент, что вам не нужно импортировать webdriver.promise.Promise что транспортир помогает синхронизировать обещания.Вам не нужно знать результат browser.get(URL). Это обещание, и это сделано для вас. Поэтому единственной причиной, по которой вы хотите импортировать это, является создание нового webdriver.promise.Promise.

Кроме того, я хотел бы импортировать WebDriver обещаниям, как:

import {promise as wdpromise} from 'selenium-webdriver' 

let wpromise = new wdpromise.Promise(resolveCallback, rejectCallback); 

// a native promise 
let npromise = new Promise(resolveCallback, rejectCallback); 

Я хотел бы избежать импорта в Promise, поскольку она также, как создавать собственные обещания ES6. См. Выше.

+0

Gotcha. Большое спасибо. Я бы хотел, чтобы возвращаемый тип navigateTo' был 'Promise '. Я нашел этот вопрос: https://stackoverflow.com/questions/27573365/how-to-use-typescript-with-native-es6-promises#27573589/. Вероятно, поэтому я смущен. Я пришел к моему ответу, потому что Intellij попросил меня импортировать эти типы, когда я определил тип возврата 'Promise '. –

+0

Закончено выполнение 'npm install --save @ types/es6-prom'. Это то, что я хотел, но я не понимал, что хочу, когда задал вопрос :). Спасибо за Ваш ответ. –

+1

Что касается 'jasmine.Promise', это было изменено в https://github.com/DefinitelyTyped/DefinitelyTyped/commit/d131a79ae894f23d26b8fac5859f040853ae2817, а не на глобальном' Promise'. – splintor

1

Я не эксперт по машинописи, чтобы ответить на ваш второй вопрос - I'm confused about why I need to specify an implementation of promise. Но я могу ответить на первую часть этого

Should I import the jasmine promise? Or the webdriver promise?

Различные команды Угломеров возвращают обещание другого типа - но в основном это webdriver.promise.Promise. Источником истины для этой информации является Protractor API docs

Некоторые примеры

  sendKeys() - webdriver.promise.Promise.<void> 
     executeScript() - promise.Promise<T> 
     getText() - webdriver.promise.Promise.<string> 
     restart() - webdriver.promise.Promise<ProtractorBrowser> 
     isPresent() - Promise<boolean> 

browser.get() возвращает webdriver.promise.Promise