Webdriver.IO - проверять неблокирующим образом, существует ли элемент
Новичок вопрос. Я использую https://webdriver.io/ для написания сквозных тестов Appium.
Я использую эти команды, чтобы проверить наличие элемента:
$(selector)
browser.waitForVisible(selector, timeout, waitForAppearOrDisappear);
browser.element('selector')
Все они блокируют мои тесты, если элемент не найден.
Как я могу проверить, существует ли элемент в определенный момент, не блокируя выполнение теста?
Я не могу найти ничего в (краткой) документации.
PS. Это должно сделать свое дело browser.findElement(By.css('[data-qa="some-id"]'));
но это не команда wdio. (findElement
а также By
не признаются)
зависимости npm:
"appium": "^1.10.0",
"appium-doctor": "^1.6.0",
"wdio-appium-service": "^0.2.3",
"wdio-jasmine-framework": "^0.3.8",
"wdio-spec-reporter": "^0.1.5",
"webdriverio": "^4.14.1",
2 ответа
Вместо этого используйте findElements - https://webdriver.io/docs/api/element/$$. Html:
$$(selector)
Это должно вернуть вам пустой массив, если элемент не может быть найден, однако это не должно вызвать сбой.
Что ж, самый простой способ - злоупотребить тем фактом, что запрос к серверу Selenium (с использованием $ / element) является непрерывной операцией.
Предположим, вам нужно запросить 2 элемента, один из которых визуализируется внутри DOM, другой нет (или элемент не существует вообще).
let thisLoaded = $('span.coreSpriteFacebookIconInverted');
let thisDidnt = $('span.coreSpriteInstagramIconInverted');
Две переменные будут иметь следующее содержимое:
thisDidnt = {
sessionId: '7056961e1950b5c54827a51c137cca96',
value: { ELEMENT: '0.8611270215748772-1',
'element-6066-11e4-a52e-4f735466cecf': '0.8611270215748772-1' },
selector: 'span.coreSpriteFacebookIconInverted',
_status: 0
}
thisDidnt = {
type: 'NoSuchElement',
message: 'An element could not be located on the page using the given search parameters.',
state: 'failure',
sessionId: '7056961e1950b5c54827a51c137cca96',
value: null,
selector: 'span.coreSpriteInstagramIconInverted'
}
Таким образом, вы можете приступить к проверке...
if (thisLoaded.value) {
// > if element loaded <
} else {
// > if element didn't load <
}
Я добавлю больше, когда вернусь домой...