gpt4 book ai didi

javascript - Protractor :我是否过度使用了 promise.then()

转载 作者:搜寻专家 更新时间:2023-11-01 04:23:23 24 4
gpt4 key购买 nike

我正在使用 Protractor 进行端到端测试。我正在处理的应用程序部分首先使用 ng-switch 语句来显示/隐藏注册过程中的问题,一次一个。问题之间有一个动画让我最难过。例如,尝试加载页面 -> 转到下一个问题 -> 断言某个元素存在是很困难的,等等。该脚本将加载页面,单击下一步按钮,然后在下一张幻灯片出现在屏幕上之前进行断言。

更糟糕的是,在问题之间大约半秒的时间里,旧问题和新问题都存在于 DOM 上。我能想到的最好的非 sleep 等待机制是做一个 browser.wait() 首先等待 DOM 上有两个问题,然后链接另一个 browser.wait() 等待只有一个再次在 DOM 上提问,然后从那里继续。 (这整个操作被包装到代码中的 registerPage.waitForTransition() 中)

browser.wait() 并不总是阻塞足够长的时间,所以我最终编写了如下代码:

it('moves to previous question after clicking previous link', function() {
var title;

// Get the current slide title, then click previous, wait for transition,
// then check the title again to make sure it changed

registerPage.slideTitle.getText()
.then(function(text) {
title = text;
})
.then(registerPage.prevLink.click())
.then(registerPage.waitForTransition())
.then(function() {
expect(registerPage.slideTitle.getText()).not.toBe(title);
});
});

为了确保在执行下一个命令之前每次等待都正确完成。现在这很完美。之前发生的情况是,测试将在 95% 的时间内成功,但偶尔会在转换实际上 100% 完成之前触发断言或下一个单击操作等。这不再发生了,但我觉得这几乎是过度使用 .then() 的 promise 。但与此同时,强制一切按顺序发生是有意义的,因为这才是与网站交互的实际方式。加载页面,然后等待下一个按钮滑入,然后进行选择,然后单击下一个按钮,然后等待下一个幻灯片等。

在带有大量动画的应用程序上使用 Protractor 时,我是否以完全错误的做法进行此操作,或者这种使用 promises 的做法是否可以接受?

最佳答案

我喜欢这类类似于代码审查的问题,因此感谢您的发帖。

我确实认为您的一些 .then 是不必要的。 .click()expect 不需要它们,因为它们应该添加到 controlFlow为你。 expect 还应该为您的 getText() 处理 promise 。

您遇到的问题似乎在您的waitForTransition() 方法中,在controlFlow 之外运行。根据您在此方法中处理等待的方式,您可能需要自己将其添加到 controlFlow。例如。你在调用非 webdriver 命令吗?我也很幸运地使用了 Expected Conditions isClickable()在这些情况下。

此外,我还会将大部分代码卸载到您的页面对象,尤其是需要等待的时候。例如,如果您将类似这样的内容添加到您的页面对象:

注册页面:

this.getSlideTitleText = function() {
return this.slideTitle.getText().then(function(text) {
return text;
});
};

this.clickPrevLink = function() {
this.prevLink.click();
return this.waitForTransition(); // fix this and the rest should work
};

那么你的测试可能是...

it('moves to previous question after clicking previous link', function() {
var title = registerPage.getSlideTitleText();
registerPage.clickPrevLink();

expect(registerPage.getSlideTitleText()).not.toBe(title);
});

关于javascript - Protractor :我是否过度使用了 promise.then(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35757406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com