【问题标题】:Jasmine: Expect does not get actual valueJasmine:Expect 没有得到实际值
【发布时间】:2015-09-03 09:27:24
【问题描述】:

这是第二部分:Expect: does not get the actual value

我能够更好地重现它,所以我有什么:

expect((rfpPage.buttons.sendRequest).getAttribute('disabled')).toBe('true');

(rfpPage.inputs.firstName).sendKeys('Name');
(rfpPage.inputs.lastName).sendKeys('Surname');
(rfpPage.inputs.email).sendKeys('name@email.com');
(rfpPage.inputs.phone).sendKeys('1234312');
(rfpPage.inputs.company).sendKeys('Company');
(rfpPage.inputs.address).sendKeys('Leningrad Motorway');
(rfpPage.inputs.city).sendKeys('Moscow');
(rfpPage.inputs.postalCode).sendKeys('125171');
(rfpPage.inputs.eventName).sendKeys('Test Meeting');

expect((rfpPage.buttons.sendRequest).getAttribute('disabled')).toBe(null);

HTML: 未填写表格时:

<button type="submit" class="btn btn-lg btn-warning pull-right ng-binding" ng-disabled="!rfpForm.$valid || isWaitForRfp" disabled="disabled">Send Request
</button>

表格填写时:

<button type="submit" class="btn btn-lg btn-warning pull-right ng-binding" ng-disabled="!rfpForm.$valid || isWaitForRfp"> Send Request
</button>

应该发生什么:

  • 正在填充所有必填字段。
  • 发送请求按钮已启用(已从 DOM 中删除禁用的属性)

第二个期望失败说期望为空。

这个测试在本地 3-4 台机器上运行良好,在多个浏览器上的 browserstack 上运行几个月。

*NOW:当它通过 BrowserStack 上的 Jenkins 执行时开始失败。 如果我在远程桌面机器上本地运行这个测试(从 Jenkins 执行测试的地方)它仍然运行得很好。在本地的几台机器上它仍然可以正常运行。在 BrowserStack 上本地运行正常。 *

我这里有量角器 2.2.0 和 Jasmine 2.3.4

在我看来,控制流出了点问题,但实际上这是非常奇怪的东西,我确实想明确地等待这个属性被删除,因为它会有所帮助,但看起来它不是正确的解决方案。

第二个样本:

    expect(contactInfoPage.selectors.contactInfoSection.companyName.isDisplayed()).toBe(false);
contactInfoPage.selectors.contactInfoSection.isCorporate.click();
expect(contactInfoPage.selectors.contactInfoSection.companyName.isDisplayed()).toBe(true);

点击前的DOM:

<input tabindex="11" type="text" ng-model="contactInfo.companyName" id="companyName" ng-required="isCorporateEvent" class="ng-valid-maxlength ng-touched ng-valid ng-valid-required" maxlength="80">

点击后的DOM:

<input tabindex="11" type="text" ng-model="contactInfo.companyName" id="companyName" ng-required="isCorporateEvent" class="ng-valid-maxlength ng-touched required ng-invalid ng-invalid-required" maxlength="80" required="required">

错误:期望真为假

【问题讨论】:

  • rfpPage.buttons.sendRequest 是做什么的?
  • @nilesh 它只是将 css 选择器发送到发送请求按钮:rfpPage.buttons.sendRequest = $('button[type="submit"]');

标签: selenium-webdriver jasmine protractor angularjs-e2e e2e-testing


【解决方案1】:

也许您只想等到提交按钮恢复为可点击状态。你试过吗?

  var EC = protractor.ExpectedConditions;
  browser.wait(EC.elementToBeClickable($('button[type="submit"]')), 10000);

【讨论】:

  • 是的,它可以被视为一种解决方法(我对任务 N1 中的其他测试采用相同的方式),但我试图了解真正的技术问题。看起来量角器应该开箱即用地处理这种情况,并且这个部分测试在所有开发机器/操作系统上都可以正常工作,但是我缺乏知识的一些魔力。它之前工作了几个月,并在没有应用任何更改的情况下开始失败
  • 我不认为这是一种解决方法。请注意,等待不会总是等待 10 秒。这是轮询元素可点击的最大时间。当你说它过去可以工作但现在只在某些机器上失败时,我意识到这是一个同步问题。例如,量角器不会知道像您这样的应用程序特定行为。我们的工作就是让测试按照我们想要的方式使用可用的 API。
【解决方案2】:

我实际上会使用 webdriver 提供的功能 - isEnabled() 检查。

根据webdriver spec,它的逻辑是检查表单元素是否具有disabled 属性:

如果表单控件是disabled,则设置为 false。

如果满足以下任一条件,则禁用表单控件:

  • 元素是按钮、输入、选择或文本区域元素,并且 在此元素上指定了 disabled 属性(无论其 价值)。
  • 该元素是 fieldset 元素的后代,其 指定了 disabled 属性,并且不是该属性的后代 fieldset 元素的第一个图例元素子元素(如果有)。
expect(rfpPage.buttons.sendRequest.isEnabled()).toBe(true);

【讨论】:

  • 是的,对于这种情况,使用 isEnabled 作为开箱即用的解决方案可能会更好,但看起来这不是这种情况下问题的根本原因。我也在问题中添加了第二个示例,它也开始无缘无故地突然失败
  • @SergeyTeplyakov 是的,但是你为什么使用isDisplayed()..而不是isEnabled()?..
  • 因为第二次我的示例 isEnabled 甚至在我单击 isCorporate 复选框之前返回 true。真正发生的事情 - 页面上未显示元素,我单击复选框并出现添加表单。在这种情况下,最初 isDisplayed 返回 false ,然后按预期单击返回 true 。但是由于某种原因,这个测试在它正常工作几个月后也开始神奇地失败了。它仍在所有开发机器上工作,但在带有 BrowserStack 的 Jenkins 上它一直失败
  • @SergeyTeplyakov 明白了。如果我错了,请纠正我 - 你不想用browser.wait() 引入显式等待来等待元素变得可见/不可见?..
  • 是的,我想避免它,因为看起来我在这里遗漏了一些基本的东西,我想了解哪里出了问题。尤其是当这些测试在任何地方都可以运行时,期望一台具有完全相同配置的远程 PC,甚至在这台 PC 上,一切都在本地运行良好......
【解决方案3】:

.IsEnabled() 应该可以工作。另外我建议使用 elementexplorer 快速找出结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多