2017-11-10 9 views
1

私は、オブジェクトを任意の順序で、不明確な回数でキャンバスに追加したり、キャンバスから削除したりできる非常に動的なサイトのテストを行っています。現在のテストでは、特定のタイプのオブジェクトを追跡し、特定の順序でそれらを操作する必要があります。Seleniumを使用してロケータと同じレベルの属性を取得する

私の人生をテスターとして簡単にするために、開発者はすべてのオブジェクトにtest-idを追加します。これはオブジェクトの種類を指定します。 キャンバス上の特定のオブジェクトを追跡するために、オブジェクトごとに一意であるため、IDを取得する必要があります。ですから、現在のテストでは、test-idを使って特定のタイプのすべてのオブジェクトのリストを取得し、それぞれのIDを取得します。

<div test-id="object-type1" id="ember935" class=...> 
    <div class="ObjectHeader"> 
    <ul> 
     <li>...</li> 
     <li>...</li> 
    </ul> 
    </div> 
</div> 

だから、ちょうど私が探しているすべてのIWebElementsのリストを返す

Driver.FindElements(By.CssSelector("*[test-id=object-type1]"); 
を使用して、すべての要素を取得:これらのオブジェクトのそれぞれの構造は次のようになります。私の問題は、これらの要素からIDを読み取る方法を見つけることができないことです。私が見ることができるのは、以下のノードです。すべてのIDを持つリストを作成することもできますが、test-idを見てフィルタリングすることはできません。

これを行うには、別のリストをお互いに比較したり、似たようなものを比較したりしなければなりませんか?次のコードブロックを使用することができますid年代を読み、印刷するには

答えて

0

IList<IWebElement> elements = Driver.FindElements(By.CssSelector("*[test-id=object-type1]"); 
foreach (IWebElement element in elements) 
{ 
    string my_id = element.GetAttribute("id"); 
    Console.WriteLine(my_id); 
} 
+1

これは素晴らしい動作です!奇妙なことは、それがほぼ正確に私がやったことですが、何らかの理由で私のコードが失敗しました。次のステップは今どこが間違っていたのかを知ることで、私はそれを繰り返さないと思う。どうもありがとう。 –

0

を私はあなたが既に答えを受け入れ知っているが、あなたがしようとしているので、私は機能でこれを包むだろうそれをたくさん使ってください。この関数は、test-idをパラメータとして取り込み、test-idで指定された要素のIDのコレクションを返します。

ところで、この場合、CSSセレクタの*は必要ありません。

/// <summary> 
/// Returns a list of IDs that correspond to the elements of type test-id 
/// </summary> 
/// <param name="testId">The test-id that the elements should contain</param> 
/// <returns>A list of IDs</returns> 
public List<string> GetIdsByTestId(string testId) 
{ 
    return Driver.FindElements(By.CssSelector($"[test-id={testId}]")).Select(e => e.GetAttribute("id")).ToList(); 
} 
関連する問題