2017-12-05 25 views
0

電子アプリケーションをテストするためにSpectronを使用しようとしています。ドキュメントでは、n番目の子を見つけようとするときに、n番目の子セレクタを使用するか、セレクタと一致するすべての子を$$で取得し、インデックス演算子、つまり$$ ("foo")[0]を最初のfooとして使用することができます。その知識とDOCS

、私は、出力に次のコードを期待:BAR 私はこの仕事を得ることができない、私は次のことを試してください。

const foo = ".foo"; 
const fooElements = app.client.$$ (foo); 
console.log ("FOOELEMENTS", await TP (app.client.getHTML (foo))); 
console.log ("BAR", fooElements[0].getText (".bar")); 

そして、次のような出力が得られます。

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) 

出力HTMLには実際には.foo個のdivがありますが、最初にアクセスしようとすると、fooElements[0]undefined

012 (関連すべきではない)

追記:

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; 
     }; 
    } 

どれ:TPは活字体は、それらが実装されている方法で混乱しているので、私は、webdriverを約束を待つことができますtoPromiseと呼ばれる私が書いた関数のエイリアスです。私が間違ってやっているアイデア?または代替案を提案しますか?可能であれば、n番目の子セレクタを避けることをお勧めします。

EDIT:クラス

答えて

0

まずオフに変更し、あなたは一例です興味をそそられます。私はあなたがどのようにして<html>の部分が走ったのかわかりません。 id値は一意である必要があります:

The id attribute specifies a unique id for an HTML element (the value must be unique within the HTML document).

あなたのコードは、単に#barセレクタを削除し、小さな変更後に動作するはずです。セレクタをELEMENTオブジェクトに渡していましたが、既にselectorキーの値でその情報が含まれています。

let locator = 'span[connectqa-device="installed"]' 

browser.debug() 

出力(debug-modeでブロックされたテスト):let retText2 = browser.getText('span[connectqa-device="installed"]')> let retText2 = browser.getText(elems[0].selector)

> let elems = $$(locator) 
[18:10:22] COMMAND  POST  "/wd/hub/session/775b024e-0b6a-4a60-a5b2-26d4df961d0a/elements" 
[18:10:22] DATA    {"using":"css selector","value":"span[connectqa-device=\"installed\"]"} 
[18:10:22] RESULT    [{"element-6066-11e4-a52e-4f735466cecf":"c6719646-30da-43ff-9b17-40c074b4988a"},{"element-6066-11e4-a52e-4f735466cecf":"d5f8acf2-8f4f-4554-9fe6-7f863555f5b5"},{"element-6066-11e4-a52e-4f735466cecf":"53ff9b0a-2a88-4b13-9e54-9c54411c03c5"}] 

> elems[0] 
{ ELEMENT: 'c6719646-30da-43ff-9b17-40c074b4988a', 
    'element-6066-11e4-a52e-4f735466cecf': 'c6719646-30da-43ff-9b17-40c074b4988a', 
    selector: 'span[connectqa-device="installed"]', 
    value: { ELEMENT: 'c6719646-30da-43ff-9b17-40c074b4988a' }, 
    index: 0 } 
> 
> elems[0].selector 
'span[connectqa-device="installed"]' 
> 
> elems[0].getText() 
[18:10:54] COMMAND  GET  "/wd/hub/session/775b024e-0b6a-4a60-a5b2-26d4df961d0a/element/c6719646-30da-43ff-9b17-40c074b4988a/text" 
[18:10:54] DATA    {} 
[18:10:54] RESULT    "Installed" 
'Installed' 

また、あなたはこれを行っている可能性があります。 2番目の例は、教訓的な目的のためのもので、おそらく決してそのようにしたくないでしょう。

希望します。乾杯!

+0

私はIDが正しいとは思っていません。最終的に修正するつもりですが、興味深いのは強制的なルールではなく、いくつかのDOM関数では動作が未定義になるということです。また、セレクタが問題ではないので、あなたの答えは意味をなさないが、それは私の問題を解決しません。問題は、getTextは未定義です。 「例外」を参照してくださいTypeError:未定義の 'getText'プロパティを読み取ることができません – austinrulezd00d

+0

@ austinrulezd00dテストケースをデバッグモードで '.debug()'を使ってロックし、初期化後に 'fooElements'が返すものを見てみましょう。 const fooElements = app.client。$$(foo); '。私が上の答えで実証したように、それは通常の設定で動作しますが、不運にも私は彼らが来るときにTypeScriptに関して手を結んでいます。 – iamdanchiv

関連する問題