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,
