Hur får man värdet på ett elementattribut i WebdriverIO med TypeScript med await-syntax?


Ämne

Mer info:

Följande kodexempel kompilerar inte:

let id = (await browser.element(selector)).getAttribute('id');

TSError: ⨯ Kunde inte kompilera TypeScript ...: Egenskapen 'getAttribute' finns inte på typen 'RawResult'. (2339)

let id = (await browser.element(selector).getAttribute('id'));

TSError: ⨯ Kunde inte kompilera TypeScript ...: Typen av ''await'' operand måste antingen vara ett giltigt löfte eller får inte innehålla en anropbar ''then'' medlem. (1320)

Svar #1

Jag vet egentligen inte varför, men webdriverio-definitionerna deklarerar ett objekt som ser ut som ett löfte men kallas Client.

I TypeScript kan du await funktioner som returnerar ett Promise. Du kan kapsla in webdriverio-API:et med dina egna funktioner och promises:

import * as webdriverio from "webdriverio";

function getTitleAsync(url: string) {
    return new Promise((resolve, reject) => {
        const options = { desiredCapabilities: { browserName: "chrome" } };
        const client = webdriverio.remote(options);
        client
            .init()
            .url(url)
            .getTitle()
            .then(function (title) {
                resolve(title);
            })
            .end();
    });
}

Då kan du vänta på din funktion:

(async () => {
    const title = await getTitleAsync("https://duckduckgo.com/");
    console.log(title);
})();

Svar #2

Faktiskt är detta ganska enkelt om din wdio körs i synkront läge - så ingen async/await behövs:

it('get attribute', () => {
    browser.url('')
    let classes = browser.element('html').getAttribute('class')
    console.warn('ATRRIBUTE CLASS IS:', classes)
})

Din classes-variabel kommer att vara ett enkelt strängobjekt.

Se bara till att du har angett property sync: true i konfigurationen:

// Per default WebdriverIO commands getting executed in a synchronous way using
// the wdio-sync package. If you still want to run your tests in an async way
// using promises you can set the sync command to false.
sync: true,