Codeceptjs Locator Builder — есть ли способ сделать contains сравнение с withAttr?

#locate #codeceptjs

#найдите #codeceptjs

Вопрос:

Я пытался использовать Locator Builder (https://codecept.io/locators/#locator-builder ) и заметил, что когда я использую withAttr, он выполняет равное сравнение

Пример: locate('a').withAttr({href: '/order/offer/'})

Переводится как: .//a[@href = '/order/offer']

Я рассматривал вариант, в котором withAttr переводится как сравнение «содержит».

Пример: .//a[contains(@href, '/order/offer')]

Поскольку href имеет динамическое значение в конце, мне пришлось использовать «contains» в моем xpath. Хотелось бы знать, есть ли аналогичная опция с Location Builder

Примечание: я видел, что withText выполняет сравнение contains

Ответ №1:

вы можете использовать что-то вроде

 locate('a[href^='/order/offer/']')
  

Это приведет к
.//a[starts-with(@href,'/order/offer')]

Ответ №2:

Нет, вы не можете сделать это с помощью locator builder, поскольку только разработчики этой функции могут определить, как она работает. Вы можете выполнить запрос функции, но, по моему опыту, эта функция широко не используется, поэтому, скорее всего, они не улучшат ее или не создадут новую команду.

Ответ №3:

Вероятно, вы ищете пользовательские локаторы.

 // inside a plugin or a bootstrap script:
codeceptjs.locator.addFilter((providedLocator, locatorObj) => {
    if (typeof providedLocator === 'string') {
      // this is a string
      if (providedLocator[0] === '=') {
        locatorObj.value = `.//*[text()="${providedLocator.substring(1)}"]`;
        locatorObj.type = 'xpath';
      }
    }
});
  

Это переводится как:

 I.click('=Login');
  

Вы можете быть довольно изобретательны с этим.