Поиск родительского элемента в webdriver.io

Я видел пару решений в исходном веб-драйвере, которые используют getAttribute('xpath') и добавляют к этому '/..', но webdriver.io не имеет атрибута xpath, поэтому я не смог его использовать. . Любые идеи о том, как захватить родительский элемент?

Случай, который я пытаюсь проверить, находится внутри макета начальной загрузки, и элемент, который фактически получает класс, который я пытаюсь проверить, находится выше. Это выглядит так:

<div class="form-group">
  <input class="form-control" type="text" name="username">
  <other stuff>
</div>

Я выбираю с помощью driver.element("input[name='username'"] но класс ошибки фактически попадает в div

<div class="form-group error">
  <input class="form-control" type="text" name="username">
  <other stuff>
</div>

Поэтому мне нужно проверить, имеет ли сам div класс ошибок, а не входные данные, которые я могу найти (в div нет уникальных элементов)

Любая помощь будет принята с благодарностью.


person Ben Hernandez    schedule 17.08.2016    source источник


Ответы (4)


Просто искал то же самое и нашел это, проверив Webdriver.IO source code — вы можете использовать el.$('..') для получения родительского элемента, например:

$('input[name="username"]').$('..') // returns the parent element

Вуаля! Это часть их поддержки селекторов XPath.

person Artem Vasiliev    schedule 01.03.2017

В итоге я решил это, используя execute для получения xpath из jQuery, вот код, который я использовал (хотя и для другого теста, который я писал - если каждая метка с * является обязательным полем). Надеюсь, это будет полезно кому-то в будущем:

var requiredXPaths = browser.execute(function () {
var returner = [];
var $elements = $('.modal.fade.in').find("label:contains('*')");
  _.each($elements, el => {
    var xpath = '';
    var element = el.parentElement;
    for (; element && element.nodeType == 1; element = element.parentNode) {
      var id = $(element.parentNode).children(element.tagName).index(element) + 1;
      id > 1 ? (id = '[' + id + ']') : (id = '');
      xpath = '/' + element.tagName.toLowerCase() + id + xpath;
    }

    returner.push(xpath);
  });
  return returner;
});

Я получил функцию xPath с другой страницы stackoverflow (Как рассчитать позицию XPath элемента с помощью Javascript?)

person Ben Hernandez    schedule 18.08.2016

WebdriverIO фактически позволяет вам использовать XPath в ваших селекторах, поэтому любой допустимый селектор Xpath должен работать. чтобы найти нужный элемент.

В качестве альтернативы вы можете просто использовать isExisting, чтобы проверить, существует ли элемент на странице, используя ошибку родитель класса:

driver.isExisting('.error input[name="username"]');

Если элемент не существует, ваш класс ошибок не был добавлен.

person Kevin Lamping    schedule 18.08.2016
comment
Спасибо, но я не хочу жестко кодировать xpath элемента, потому что это делает тесты хрупкими. - person Ben Hernandez; 18.08.2016

Я говорил об этом в гиттере, когда родителя можно выбрать input[name="username"]

Родительский элемент этого элемента может быть выбран как //div[input[name="username"]]

person Mathieu Brouwers    schedule 13.07.2018