jasmine.Promise 与 webdriver.promise.Promise

Posted

技术标签:

【中文标题】jasmine.Promise 与 webdriver.promise.Promise【英文标题】:jasmine.Promise vs webdriver.promise.Promise 【发布时间】:2017-06-26 17:01:37 【问题描述】:

Protractor 页面对象测试中使用此方法:

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

想要定义返回的类型,即Promise&lt;any&gt;

我应该导入jasmine 承诺吗?还是webdriver 承诺?

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

import Promise = jasmine.Promise;

我对为什么需要指定 promise 的实现感到困惑。我可以为Promise指定一个接口吗?


编辑:我真正想做的是:

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

这给了我Promise&lt;any&gt; 类型。

相关问题:How to use Typescript with native ES6 Promises

【问题讨论】:

ES6 Promise 有什么问题,为什么不用它来代替? 我得到一个 TSError: Unable to compile TypeScript practice.e2e-spec.ts : Cannot find name 'Promise' 所以也许我可以使用 ES6 承诺,但我没有它的类型? 【参考方案1】:

我不是 TypeScript 专家来回答你的第二个问题 - 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

【讨论】:

【参考方案2】:

正在导入webdriver.promise.Promise

大多数对 selenium-webdriver 的 API 调用都返回 webdriver.promise.Promise。这些承诺通过控制流按顺序执行。最近,他们已经从自己的 Promise 实现切换到原生 ES6 风格的 Promise。

您需要将webdriver.promise.Promise 导入您的量角器测试吗?应该不会吧。

正在导入jasmine.Promise

jasmine.Promise 不是来自 jasmine 类型,而是来自 jasminewd2 类型。这是使其余类型正常工作的助手。您应该将jasmine.Promise 导入到您的测试中吗?绝对没有。

量角器出现同步

我认为您不需要导入 webdriver.promise.Promise 的论点是 Protractor 有助于同步承诺。您不需要知道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 承诺的方式。见上文。

【讨论】:

明白了。非常感谢。我希望navigateTo 的返回类型为Promise&lt;any&gt;。我发现了这个问题:***.com/questions/27573365/…。这大概就是我困惑的原因。我之所以回答是因为 Intellij 在我定义返回类型 Promise&lt;any&gt; 时提示我导入这些类型。 结束了npm install --save @types/es6-promise。这就是我想要的,但是当我问这个问题时我不明白我想要什么:)。谢谢你的回答。 关于jasmine.Promise,这是在github.com/DefinitelyTyped/DefinitelyTyped/commit/… 中更改的,而不是使用全局Promise 这是有道理的。我很高兴这被清理干净了。

以上是关于jasmine.Promise 与 webdriver.promise.Promise的主要内容,如果未能解决你的问题,请参考以下文章

webdriver介绍&与Selenium RC的比较

与Python Scrapy中的Selenium WebDriver并发

Webdriver API(元素定位与操作)

WebDriver 命令与操作

unittst与webdriver的关系

Python爬虫编程思想(93):Selenium与WebDriver安装