Метод gratAttributeFrom () не возвращает значение. Возвращает только объект, обещание - PullRequest
0 голосов
/ 04 апреля 2020

Как получить значение, используя grabAttributeFrom в codecept. Он возвращает только объект, обещание. Как получить значение атрибута из него.

 let userid_xpath = await I.grabAttributeFrom("//div[@class='mat-form-field-infix']/input[contains(@id,'mat-input')]","id");
    var userid = "//*[@id='"+userid_xpath+"']";
    I.fillField(userid,"username")

Если я использую как выше и выполняю тест, я не получаю никакой ошибки. но я видел панель отладки, как показано ниже

 Emitted | step.after (I grab attribute from "//mat-label[contains(text(),'UserId')]//ancestor::label//ancestor::span//ancest... 
    Emitted | step.before (I fill field "//*[@id='[object Promise]']", "username")

Как получить значение атрибута и использовать его в строке. Если я передам переменную userid_xpath в assert; оно работает. но мое требование - передать его в виде строки, а затем использовать его.

1 Ответ

0 голосов
/ 06 апреля 2020

Внимательно посмотрите в документации

Возвращает то, что было сказано, чтобы вернуть.

Возвращает Promise<string> значение атрибута.

Связь между codecept js и браузером асинхронна. Codecept js ищет синхронизацию действий, отправляемых в браузер. Но он не может найти ответ браузера, поэтому вы должны вручную указать для codecept js ждать результата.

В Codecept JS такая реализация выполняется с помощью Promises

Чтобы получить значение от Promise, вы должны дождаться его let userid_xpath = await I.grabAttributeFrom(someSelector);

Но ожидание Promise закончится выполнением из-за внутренней реализации Codecept js. Итак, как сказано в docs :

Возобновляет выполнение теста, поэтому его следует использовать внутри async с оператором await.

mark Вы тестируете функцию как async:

Scenario("should log viewability point, when time and percent are reached", async (I) => {
  I.amOnPage(testPage);
  const userid_xpath = await I.grabAttributeFrom("//div[@class='mat-form-field-infix']/input[contains(@id,'mat-input')]","id");
  const userid = "//*[@id='" + userid_xpath + "']";

  I.fillField(userid, "username")
});
...