Ich versuche Spectron zu verwenden, um meine Electron-Anwendung zu testen. Die Dokumentation sagt, wenn Sie versuchen, das n-te Kind zu finden, können Sie einen n-ten Child-Selektor verwenden oder alle untergeordneten Selektoren mit $$
abrufen und dann den Indexoperator verwenden, dh $$ ("foo")[0]
wird zuerst foo. DOCS
Mit diesem Wissen, erwarte ich den folgenden Code zur Ausgabe: BAR
ich nicht, diese Arbeit bekommen, ich versuche folgendes:
const foo = ".foo";
const fooElements = app.client.$$ (foo);
console.log ("FOOELEMENTS", await TP (app.client.getHTML (foo)));
console.log ("BAR", fooElements[0].getText (".bar"));
und nutzen Sie die folgende Ausgabe:
console.log components\pages\analysis\__test__\Analysis.spectron.ts:44
FOOELEMENTS [ '<div class="foo"><div class="bar">BAR</div><div class="baz">BAZ</div></div>',
'<div class="foo"><div class="bar">BAR2</div><div class="baz">BAZ2</div></div>',
'<div class="foo"><div class="bar">BAR3</div><div class="baz">BAZ3</div></div>'
'<div class="foo"><div class="bar">BAR4</div><div class="baz">BAZ4</div></div>' ]
console.log components\pages\analysis\__test__\Analysis.spectron.ts:50
EXCEPTION TypeError: Cannot read property 'getText' of undefined
at components\pages\analysis\__test__\Analysis.spectron.ts:45:44
at Generator.next (<anonymous>)
at fulfilled (components\pages\analysis\__test__\Analysis.spectron.ts:4:58)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
Wie Sie sehen können, die HTML-Ausgabe hat in der Tat mehrere .foo
divs, aber wenn ich versuche, den ersten zu gelangen, heißt es fooElements[0]
ist undefined
Nebenbei bemerkt (die nicht relevant sein sollte): TP
ist ein Alias für eine Funktion i toPromise
genannt schrieb, die mir die WebDriver Versprechungen erwarten lässt, weil Typoskript von der Art und Weise verwirrt wird sie durchgeführt werden:
export async function toPromise<T> (client: Webdriver.Client<T>)
{
return client as any as Promise<T>;
}
// Promise
interface Client<T> {
finally(callback: (...args: any[]) => void): Client<T>;
then<P>(
onFulfilled?: (value: T) => P | Client<P>,
onRejected?: (error: any) => P | Client<P>
): Client<P>;
catch<P>(
onRejected?: (error: any) => P | Client<P>
): Client<P>;
inspect(): {
state: "fulfilled" | "rejected" | "pending";
value?: T;
reason?: any;
};
}
Beliebig Idee, was ich falsch mache? Oder eine vorgeschlagene Alternative? Ich würde lieber N-Kind-Selektoren vermeiden, wenn möglich.
EDIT: geändert Klasse
Ich weiß, die ID ist nicht ganz richtig, es ist etwas, das ich irgendwann beheben werde, aber was interessant ist, das ist keine erzwungene Regel, es ist eher ein Vorschlag, aber für einige DOM-Funktionen wird das Verhalten undefiniert. Auch wenn Ihre Antwort sinnvoll ist, behebt sie mein Problem nicht, da der Selektor nicht das Problem ist. Das Problem ist, dass getText nicht definiert ist. siehe 'EXCEPTION TypeError: Kann die Eigenschaft 'getText' von undefined nicht lesen. – austinrulezd00d
@ austinrulezd00d Ich würde damit beginnen, den Testfall im Debug-Modus mit' .debug() 'zu sperren und zu schauen, was' fooElements' nach der Initialisierung zurückgibt: ' const fooElements = app.client. $$ (foo); '. Wie ich in der obigen Antwort gezeigt habe, funktioniert es mit einem normalen Setup, aber leider habe ich meine Hände in Bezug auf TypeScript gebunden, wo ich als Neuling bin, wie sie kommen. – iamdanchiv