2016-06-13 2 views
7

В одном из тестов нам нужно утверждать, что присутствует один из трех элементов. В настоящее время мы делаем это с помощью protractor.promise.all() и Array.reduce():Утверждение массива сводится к истинному

var title = element(by.id("title")), 
    summary = element(by.id("summary")), 
    description = element(by.id("description")); 

protractor.promise.all([ 
    title.isPresent(), 
    summary.isPresent(), 
    description.isPresent() 
]).then(function (arrExists) { 
    expect(arrExists.reduce(function(a,b) { return a || b; })).toBe(true); 
}); 

Есть ли лучший способ решить эту проблему с Жасмин без разрешения обещаний явно? Нужен ли нам специальный счетчик или его можно решить с помощью встроенных помощников?

+1

Обратите внимание, что вместо 'reduce' вы можете использовать' arrExists.some (function (a) {return a;}) '. С Jasmine вы должны использовать аргумент ['done' в' it' callback] (http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support) и называть его, когда вы закончите с тестом , Я не думаю, что есть лучший способ. Вам все равно нужно ждать обещаний. – trincot

+0

@ trincot спасибо за точку. Вероятно, я должен был упомянуть, что ['expect()' исправлено "в Protractor для неявного решения обещаний] (http://www.protractortest.org/#/control-flow#protractor-adaptations) .. но так как я должны сочетать результаты нескольких обещаний друг с другом, в этом случае это может не помочь. – alecxe

+1

Вы должны указать 'false' как начальное значение, чтобы оно также работало и на пустых массивах. Или просто используйте '.some (Boolean)' вместо этого. – Bergi

ответ

2

Проверьте это:

let EC = protractor.ExpectedConditions; 

let title = EC.visibilityOf($("#title")), 
    summary = EC.visibilityOf($("#summary")), 
    description = EC.visibilityOf($("#description")); 

expect(EC.or(title, summary, description)()).toBeTruthy('Title or summary or description should be visible on the page') 

Обратите внимание, что я уверен, выполнение функции, которая возвращает ExpectedCondition - так я получаю результат этой функции (Promise, который будет разрешен к булеву) вместо функции.

Вы можете использовать .presenceOf(), если вам это нужно вместо .visibilityOf()

http://www.protractortest.org/#/api?view=ExpectedConditions.prototype.or

+0

Удивительная идея использовать ожидаемые условия, никогда не думала об этом. Благодарю. – alecxe

3

Вы можете просто получить все элементы с помощью одного переключателя и утверждают, что граф превосходит нуля:

var title_summary_description = element.all(by.css("#title, #summary, #description")); 
expect(title_summary_description.count()).toBeGreaterThan(0); 
+0

Интересное готовое мышление, спасибо! – alecxe

Смежные вопросы