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 <
}

Я добавлю больше, когда вернусь домой...

Другие вопросы по тегам