Почему функция «на месте» не может ссылаться на класс, в котором она находится? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть этот код, который я использую, который ожидает загрузки крошки на страницу. Проблема в первой строке, в которой я создаю свою собственную функцию для использования вместо ExpectedCondition, поскольку ExpectedConditions не выполняет проверку содержимого, и это то, что мне нужно в этом месте. Так как я сделал свою собственную функцию на месте, я, кажется, за пределами области класса, в котором я нахожусь. Поэтому я забыл о том, почему это нарушает область видимости и почему я не могу ссылаться на другой метод getProjectNameBreadCrumbText(), который существует в моем классе из этого метода на месте.

Я обнаружил проблему, когда получил ошибку Failed: Cannot read property 'getProjectNameBreadCrumbText' of undefined. Я понимаю, что this не определено, но я не понимаю, почему. Я также не знаю, смогу ли я как-то передать this и, следовательно, класс, в котором я нахожусь по ссылке, потому что я не уверен в точной терминологии кода, который я сейчас использую.

// My Page Object class
export class MapperPage {
    ...
    async getProjectNameBreadCrumbText() {
        return await this.breadCrumbs.get(2).getText();
    }
    ...
    async waitAndVerifyProjectNameBreadCrumbs(projectName: string) {
        await browser.wait(async function() {return (await this.getProjectNameBreadCrumbText()).indexOf(projectName) > -1;},
            this.DEFAULT_WAIT_TIME_SECONDS * 1000, 'Name Breadcrumb for this page never loaded.');
        expect(await this.getProjectNameBreadCrumbText()).toContain(projectName);
        expect(await this.getProjectMapperBreadCrumbText()).toEqual(this.MAPPER_BREADCRUMB);
    }
}


// In my test I call the waitAndVerify method like so
...
it('test', async() => {
    const PROJECT_NAME = 'Project Name';
    ... // do other things
    // wait for the page to load by making sure the breadcrumbs have loaded
    await waitAndVerifyProjectNameBreadCrumbs(this.PROJECT_NAME);
});

Приношу свои извинения, если это дублирующий вопрос, я не знал, как Google, что я прошу, так как я не уверен в правильной терминологии для этого кода, который я пишу.

1 Ответ

0 голосов
/ 29 августа 2018

Похоже, вы передаете функцию в качестве параметра. Так что область действия может быть изменена . Вы можете использовать функцию стрелки , чтобы иметь доступ к правильной области:

await browser.wait(
    async () => (await this.getProjectNameBreadCrumbText()).includes(projectName),
    this.DEFAULT_WAIT_TIME_SECONDS * 1000, 
    'Name Breadcrumb for this page never loaded.'
);

Как другой вариант - вы можете связать функцию с необходимой областью вручную:

this.getProjectNameBreadCrumbText = this.getProjectNameBreadCrumbText.bind(this);
await browser.wait(
    async function() {return (await this.getProjectNameBreadCrumbText()).indexOf(projectName) > -1;},
    this.DEFAULT_WAIT_TIME_SECONDS * 1000, 
    'Name Breadcrumb for this page never loaded.')
...