Чувак, я потратил пару недель на изучение этого вопроса, и да, четких ответов НЕТ, пока я не понял, как транспортир работает в деталях.Если вы тоже это понимаете, вы найдете оптимальный вариант для вас.
РЕШЕНИЕ НИЖЕ ПОСЛЕ КРАТКОЙ ТЕОРИИ
1) Если вы попытаетесь передать асинхронную функцию вdescribe
вы видите, что он потерпит неудачу, потому что он принимает только синхронную функцию
Что это значит для вас, что любое условие, которое вы хотите передать этому блоку, не может быть основано на Promise (Promise == разрешается когда-нибудь, но не сразу).То, что вы пытаетесь сделать, по сути является обещанием (откройте страницу, сделайте что-нибудь и подождите, чтобы убедиться, что условие удовлетворяет вашим критериям)
if (conditionIsTrue) { // can't be Promise
it('name', () => {
})
}
Это первое, что нужно учитывать ... 2) Когда вы запускаететранспортир, он выбирает спецификации файлов, указанных в конфигурации, и создает очередь из блоков describe/it
AND beforeAll/afterAll
.ВАЖНАЯ ИНФОРМАЦИЯ ЗДЕСЬ, ЧТО ЭТО ПРОИСХОДИТ ПЕРЕД НАЧАЛОМ БРАУЗЕРА.
Посмотрите на этот пример
let conditionIsTrue; // undefined
it('name', () => {
conditionIsTrue = true;
})
if (conditionIsTrue) { // still undefined
it('name', () => {
})
}
К тому времени, когда транспортир достигнет утверждения if()
, значение conditionIsTrue
все ещеundefined
.И он может быть перезаписан внутри блока it
при запуске браузера позднее, но не при построении очереди.Поэтому он пропускает его.
ВОЗМОЖНОЕ РЕШЕНИЕ Определите глобальную переменную вне describe
let conditionIsTrue; // undefined
describe("describe", () => {
it('name1', async () => {
conditionIsTrue = await element.isPresent(); // NOW IT'S TRUE if element is present
})
it('name2', async () => {
if (conditionIsTrue) {
//do whatever you want if the element is present
} else {
console.log("Skipping 'name2' test")
}
})
})
Так что вы не пропустите сам блок it
,однако вы можете пропустить что-нибудь внутри it
Еще одна возможность, которую я обнаружил, но у которой никогда не было возможности проверить, - это использовать средство запуска задач Grunt, которое может помочь вам реализовать следующий сценарий
- Запуск транспортира для выполнения одной спецификации
- Проверка нужного условия
- Экспорт этого условия в переменную среды
- Выход из транспортира
- В вашей реализации задачи Gruntусловная логика для выполнения остатков условных спецификаций путем повторного запуска транспортира
Но, честно говоря, я не понимаю, почему вы захотите пройти этот трудоемкий маршрут, который требует много кода... но как FYI