【发布时间】:2016-01-23 15:06:45
【问题描述】:
故事:
我们开发了一个定制的茉莉花匹配器,它主要做两件事:
- 鼠标悬停在给定元素上
- 检查是否有带有所需文本的工具提示
实施:
toHaveTooltip: function() {
return {
compare: function(elm, expectedTooltip) {
var tooltipPage = requirePO("tooltip");
browser.actions().mouseMove(elm).perform();
browser.wait(EC.visibilityOf(tooltipPage.tooltip), 5000, "Tooltip is still not visible.");
return {
pass: tooltipPage.tooltip.getText().then(function(actualTooltip) {
return jasmine.matchersUtil.equals(actualTooltip, expectedTooltip);
}),
message: "Element does not have the tooltip '" + expectedTooltip + "'."
};
}
};
},
其中tooltipPage 是单独定义的页面对象:
var Tooltip = function () {
this.tooltip = element(by.css(".tooltip"));
};
module.exports = new Tooltip();
这种用法对我们来说非常方便,并且确实有助于遵循 DRY 原则,保持我们的测试代码库的清洁和可读性:
expect(page.fromDateInput).toHaveTooltip("After");
问题和问题:
现在,我要做的是让匹配器分别处理 2 个用例:
- 鼠标悬停时根本没有显示任何工具提示(基本上就是
browser.wait()被拒绝的承诺) - 有一个工具提示,但不是所需的提示
如何改进匹配器,使其能够分别处理这两个问题并报告不同的错误?
我的尝试:
toHaveTooltip: function() {
return {
compare: function(elm, expectedTooltip) {
var tooltipPage = requirePO("tooltip");
browser.actions().mouseMove(elm).perform();
return browser.wait(EC.visibilityOf(tooltipPage.tooltip), 5000, "Tooltip is still not visible.").then(function () {
return {
pass: tooltipPage.tooltip.getText().then(function(actualTooltip) {
return jasmine.matchersUtil.equals(actualTooltip, expectedTooltip);
}),
message: "Element does not have the tooltip '" + expectedTooltip + "'."
};
}, function () {
return {
pass: false,
message: "No tooltip shown on mouse over the element"
}
});
}
};
},
在这里,我尝试明确解决browser.wait() 并分别处理“成功”和“错误”情况。这导致 Jasmine Spec 超时并在控制台上显示巨大的“红色”文本:
Expected ({ ptor_: ({ setFileDetector: Function, ...
5 minutes scrolling here
... InnerHtml: Function, getId: Function, getRawId: Function }) to have tooltip 'After'.
恐怕我无法从“比较”函数返回承诺。
【问题讨论】:
-
嗨,请问您使用的是什么版本的茉莉花? 1.x 还是 2.x?
-
@vrachlin 当然,茉莉花 2。谢谢。
标签: javascript selenium jasmine promise protractor