Почему эта структура в классе машинописного текста приводит к ошибке времени выполнения, когда она просто компилируется? - PullRequest
0 голосов
/ 22 мая 2018

Я пишу для транспортира с жасмином.Я хорошо разбираюсь в Java и тестировании браузеров, но я новичок в JavaScript и Protractor.

Я работаю над переходом моего кода к «новому» стилю использования асинхронного режима и ожидаю, чтобы перейти к изменениям потока управления (если я ошибаюсь в своем понимании этого, я извиняюсь), и ясталкиваюсь с проблемами, когда дело доходит до конвертации классов объектов моей страницы.Сначала я попытался напечатать свою функцию в «Строка A» как Promise, но я получил ошибку, что «тип any [] не конвертируется в тип ElementArrayFinder».По предложению я изменил его на то, что в настоящее время существует "Обещание", которое компилируется, но не запускается с ошибкой ниже указанного кода.До своего преобразования я просто передавал объект ElementArrayFinder без проблем, и мой код работал, поэтому у меня есть ранее работающий код, мне просто нужно выяснить, как заставить его работать в этой новой структуре.

// my po class
...
// Breadcrumb methods
async getBreadCrumbs(): Promise<any> {  // Line A
   return await element.all(by.css('bread-crumbs span'));
}

async getProjectNameBreadCrumbText() {
    const breadCrumbs: ElementArrayFinder = await this.getBreadCrumbs();
    return await breadCrumbs.get(2).getText();
}

async getProjectMapperBreadCrumbText() {
    const breadCrumbs: ElementArrayFinder = await this.getBreadCrumbs();
    return await breadCrumbs.get(3).getText();
}

Похоже, что компилируется нормально без ошибок IDE в Webstorm, но когда я запускаю его, я получаю сообщение об ошибке:

Failed: breadCrumbs.get is not a function
TypeError: breadCrumbs.get is not a function

И в случае, если это имеет значение, здесь код с использованием вышеуказанного класса POэто вызывает ошибку, когда он вызывает код во время выполнения:

it('test case', async function() {
...
await expect(mapperPage.getProjectMapperBreadCrumbText()).toEqual(mapperPage.MAPPER_BREADCRUMB);
...
});

Я открыт для конструктивной критики о том, как я должен писать этот код, я в большинстве своем отмахиваюсь от объединения кодабит.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Так как вы возвращаете element.all (by.css ('span-c-crbs')) из getBreadCrumbs () ваши другие функции фактически получают массив WebElement вместо ElementArrayFinder .Таким образом, вы должны иметь возможность вызывать

панировочные сухари [n] .getText ()

В ваших функциях

Мое личное предложение будет для васотойдите от функции, возвращающей ваш селектор, и вместо этого установите их как свойства класса объекта вашей страницы:

public breadcrumbs = element.all (by.css ('span-crumbs span'));

Что упрощает getProjectNameBreadCrumbText () до:

async getProjectNameBreadCrumbText(): Promise<string> { return this.breadCrumbs.get(2).getText(); }

И ваш тест:

it('test case', async function() { ... expect(await mapperPage.getProjectMapperBreadCrumbText()) .toEqual(mapperPage.MAPPER_BREADCRUMB); ... });

Если вы хотите, я с удовольствием предоставлю вам мой общий формат объектов страницы, спецификации и конфигурации, которые я использовал для async / await с отключенным диспетчером Promise.

0 голосов
/ 22 мая 2018

Потому что element.all(by.css('bread-crumbs span'));, кажется, приводит к undefined.Undefined соответствует любому типу в Typescript, если вы не отключите его в своем tsconfigТакже Typescript переносит в JavaScript и не обеспечивает корректность типов во время выполнения.Поэтому, особенно если вы используете сторонние скрипты, не полагайтесь на объявления типов, не проверяя их.

...