【问题标题】:Protractor Extension of ElementFinderElementFinder 的量角器扩展
【发布时间】:2019-12-11 09:48:58
【问题描述】:

我正在尝试使用一些其他方法来扩展 Protractor 的 ElementFinder。 我这样做的方式与我扩展其他类的方式完全相同,它可以毫无问题地工作。 在一个名为“protractor-extension.ts”的单独文件中,包含模块声明和方法实现:

declare module 'protractor/built/element' {
  export interface ElementFinder {
      safeClick() : Promise<void>;
  }
}

(protractor.ElementFinderas any).safeClick= function () {
  const _self = this as protractor.ElementFinderas ;
   return await browser.wait(ExpectedConditions.elementToBeClickable(self), 5000)
      .then(function() {
          return self.click(); //if found
      }, function() {
          console.error(`Element is not clickable`); //error
      });
}

然后将该文件导入到使用 safeClick() 的 .spec 文件中,并带有“import './extensions/protractor-extension.ts';”

该函数已被识别,当在任何 ElementFinder 上使用它时,我会立即在代码完成中得到它。

问题:在运行时我总是得到“失败:myButton.safeClick 不是一个函数”

正如我所说,如果我将整个示例 1:1 替换为 moment.js 示例,它就可以工作。所以它似乎与量角器中的ElementFinder有关? 与该主题相关的所有现有帖子也建议完全按照我所做的那样做,但其中大多数都已过时(

感谢任何能引导我找到正确解决方案的提示。

编辑: 以下是扩展方法的使用方法:

1) 在页面对象中,声明元素

export class AdminPage {

  /*  ELEMENTS  */
  public userTable =   element(by.id('userTable'));
  public unlockBtn = element(by.id('unlockBtn'));    
}

2)在测试(.spec文件)中,使用了扩展方法

it('unlock button should disappear after click', async () => {
  await this.adminPage.unlockBtn.safeClick();
  expect(this.unlockBtn.isPresent()).toBeFalsy();
});

-> .safeClick() 在写入“this.adminPage.unlockBtn..”时自动完成 -> .safeClick() 在运行时无法识别并抛出错误

【问题讨论】:

    标签: typescript protractor


    【解决方案1】:

    我猜你在脚本中使用element()element.all() 在页面上声明网页元素。

    elementall 是类ElementFinder 的实例,它们都是在运行测试用例的最开始时创建的。

    如果您在创建elementallelementall 之后执行上述代码,则不会包含safeClick()

    以下是量角器初始化程序:

    lib/cli.ts https://github.com/angular/protractor/blob/master/lib/cli.ts#L242
    
     --> lib/launcher.ts initFn()
    
      --> lib/launcher.ts createNextTaskRunner()
    
       --> lib/taskRunner.ts run()  https://github.com/angular/protractor/blob/master/lib/launcher.ts#L222
    
        --> lib/runner.ts run()    https://github.com/angular/protractor/blob/master/lib/runner.ts#L334
    
         --> lib/runner.ts createBrowser()       https://github.com/angular/protractor/blob/master/lib/browser.ts#L316
    
          --> lib/brower.ts ProtractorBrowser()  https://github.com/angular/protractor/blob/master/lib/runner.ts#L237
              // element created in this method
    
         --> lib/runner.ts setupGlobals_()     https://github.com/angular/protractor/blob/master/lib/runner.ts#L335
              // setup element, all, $$, browser in global space
    

    据我所知,量角器没有提供类似钩子的东西来让用户在lib/runner.ts createBrowser() 之前做某事。如果有,您可以在钩子中添加您的代码。

    【讨论】:

    • 我添加了我如何使用这些方法,对我来说它看起来应该是,但也许我错过了一些东西。 ElementFinder 的创建如何与其功能扩展交互(我在 Typescript 中发现了它所谓的模块扩充)?
    • 你在哪里定义了safeClick()?在单独的文件中,在 protractor.conf.js 中,在 pageobject 文件中,在测试用例文件中?您何时/何地加载它?
    • 它是一个名为“protractor-extension.ts”的单独文件,其中包含模块声明和方法实现。然后将该文件导入到使用 safeclick 的 .spec 文件中,使用“import './extensions/protractor-extension.ts';”为了验证我是否正确地定义了我对另一个模块(时刻 js)所做的所有事情,使用相同的文件位置。成功了。
    • 如上所述,要归档您的目标,您必须在创建 elementall 之前导入 protractor-extension.ts。 moment.js 工作中相同的原因是它不是量角器的一部分,ElementFinder 不依赖于它。如果视情况而定,memont.js 中的相同内容也不应该起作用。
    • 所以简而言之,由于量角器中缺少钩子,因此无法在量角器创建元素和全部之前初始化 ElementFinder 模块扩充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多