这是我的第一篇文章,所以请放轻松一个人。 :)
我是量角器的新手,因此我想请求您的帮助。 我被要求为下面的代码编写一个测试:
<div class="content ps-container ps-active-y expand" ng-class={hide:items.length === 2}" ng-transclude="" csf-product-navigator-content="" csf-scrollbar="" style="">
<div class="product-wrp prod-active" ng-class="{'prod-active' : active, 'odd' : (odd === true && !active), 'even' : (odd !== true && !active)}" ng-repeat="product in accounts" csf-product-navigator-item="">
<div class="product-wrp odd" ng-class="{'prod-active' : active, 'odd' : (odd === true && !active), 'even' : (odd !== true && !active)}" ng-repeat="product in accounts" csf-product-navigator-item="">
<div class="product-item animate-hide" ng-click="onDropdowmItemClick()" ng-transclude="" csf-product-navigator-anim-item="">
<div class="ng-scope" ng-repeat="product in accounts" csf-product-navigator-item="">
<div class="navigator-view ng-hide" ng-show="active">
<div class="" ng-hide="active">
<div class="product-choice ng-scope" ng-if="product.type !== 'SM'">
<section class="product-name">
<header class="ng-scope" ng-if="product.name">
<p class="product-details" ng-show="product.type">
<span class="ng-binding" ng-bind="product.no">PL84 9101 0003 2001 0006 1883 0004</span>
</p>
</section>
<section class="product-amount">
</div>
</div>
</div>
</div>
</div>
<div class="product-wrp even" ng-class="{'prod-active' : active, 'odd' : (odd === true && !active), 'even' : (odd !== true && !active)}" ng-repeat="product in accounts" csf-product-navigator-item="">
<div class="product-wrp even" ng-class="{'prod-active' : active, 'odd' : (odd === true && !active), 'even' : (odd !== true && !active)}" ng-repeat="product in accounts" csf-product-navigator-item="">
<div class="product-wrp odd" ng-class="{'prod-active' : active, 'odd' : (odd === true && !active), 'even' : (odd !== true && !active)}" ng-repeat="product in accounts" csf-product-navigator-item="">
<div class="product-wrp even" ng-class="{'prod-active' : active, 'odd' : (odd === true && !active), 'even' : (odd !== true && !active)}" ng-repeat="product in accounts" csf-product-navigator-item="">
目标是在下拉列表中获取产品数量。
所以我想我应该在容器中获取所有元素,然后使用函数来完成它们。
这是我的代码:
特征(iOwe):
var iOwe = function () {
this.accNo = element(by.className('content ps-container ps-active-y expand')).all(by.className('product-item animate-hide'))
}
规格(iOwe):
it('should display accounts numbers on dropdown list', function () {
expect(iOwe.accNo.count()).not.toBe(0);
iOwe.accNo.each(function(elem) {
elem.element(by.className('product-details')).getText()
.then
(function (text){
console.log(text);
});
});
问题是我每次运行测试时都会在控制台中获得不同的输出。 只获得前3/4个字符串(应该是7)并且休息是空的。
感谢您的帮助
编辑:
我通过添加检查了测试期间到底发生了什么
browser.sleep(5000);
每次控制台打印字符串时,我发现我必须实际看到(在浏览器中)以下帐户以允许测试来阅读它。
答案 0 :(得分:2)
目标是在下拉列表中获取产品数量。
最合乎逻辑的方法是使用by.repeater()
定位器:
var products = element.all(by.repeater("product in accounts"));
expect(products.count()).toEqual(7);
或者,使用 CSS选择器:
var products = $$("p.product-details");
expect(products.count()).toEqual(7);
如果这是一个计时问题,您可以专门等待与定位器匹配的元素数量:
function waitForCount(elements, expectedCount) {
return elements.count().then(actualCount) {
return actualCount >= expectedCount;
});
}
browser.wait(waitForCount($$("p.product-details"), 7), 5000);
答案 1 :(得分:1)
我对我的问题有所了解,这不是选择者/匹配者的问题。
正如我根据Article发现的那样 为了.getText()你必须在浏览器中实际看到该元素,否则它将返回空字符串。
我决定找另一种获取文字的方法,我用
BeanWrapperFieldExtractor
获取字符串。
基本上我改变了:
.getAttribute()
到
elem.element(by.css('span.ng-binding')).getText()
它以accnumber返回字符串。
但是... 这不是我想要的。 我想检查浏览器中的元素是否实际可见,并且下面的解决方案无效。
然后我找到了这个Question,它显示了如何向下滚动到浏览器中的元素你想要检查。
所以我编辑了我的代码:
elem.element(by.css('span.ng-binding')).getAttribute('outerHTML')
这是我的问题的答案。
感谢您的帮助!
答案 2 :(得分:0)
你可以尝试这样的事情 -
it('should display accounts numbers on dropdown list', function () {
expect(iOwe.accNo.count()).not.toBe(0);
iOwe.accNo.each(function(elem) {
expect(elem.element(by.css('p.product-details')).isDisplayed()).toBe(true);
elem.element(by.css('span.ng-binding')).getText()
.then
(function (text){
console.log(text);
});
});