2017-06-21 11 views
0

私のセレンテストでは、特定の値を持つ入力要素を見つける必要があります。XPathを使用して入力値をテストする方法

UIは、コードを次によってレンダリングされます。

<div id="product-list"> 
    <!-- ko foreach: $data.productItems --> 
    <div class="product-list-item"> 
     <input data-bind="value: $data.name"> 
    </div> 
    <!-- /ko --> 
</div> 

マイSeleniumテストは、特定の名前の入力要素を見つけるために、次のコードを使用しています:

By xpath = By.xpath(".//div[@id='product-list']//div[contains(@class, 'product-list-item')]/input[@value='Product Name']"); 
WebElement element = browser.getWebDriver().findElement(xpath); 

問題は、その要素がinput[value='Product Name]"以来、常にnullであります入力に「値」属性がないため、常に失敗します。あなたはそれを介して見ることができるだけのプロパティ "値"があります。 Chromeの「デベロッパーツール」

「値」が正しく処理されない理由を調査するための例がいくつかあります。

jsfiddle example

適切な入力要素を見つけるためにどのようにいくつかのアドバイスはありますか?または少なくとも値の属性と値のプロパティを処理する方法を説明する?

EDIT1:固定input[@value='Product Name']

にEDIT2 @行方不明:更新された例

EDIT3は:DOMプロパティにアクセスできないことXPATHによって引き起こされる問題ではないとHTML(またはその他のXGMLを処理することができるだけです)タグ構造とその属性?ノックアウトは実際の値をDOMプロパティにプッシュするだけなので、XPATHから到達できません。

+1

value属性を使用すると、ブラウザは入力の初期値を設定できるため、その中から試して選択する必要はありません。セレンを使用して、クラスproduct-list-itemのすべての要素を見つけ出し、それらを繰り返し、気になる価値のある要素を取得します。または、JavaScriptを実行して目的の値を持つ要素を返します。最初の方法は私の意見では良いです。 –

+0

@BryanEuton属性値は初期値のみです。それは、多くの感謝を説明します。反復は不可能です。ノードを返さなければならない単一のxpathを使って1つのショットしかありません(存在する場合)。 –

+0

getWebDriver()は、xpathセレクタをとるfindElementsという別のメソッドを持つ必要があります。 –

答えて

0

あなたのXPathの最後の部分が間違っています:

/input[value='Product Name'] 

これは、あなたがそれをvalue属性がProduct Nameに等しいです<input>を探していることを意味します。 <input>の値(ないvalue属性)を取得し、WebElementを検索した後

/input[@data-bind='value: Product Name'] 

あなたが代わりにdata-bind属性を検索したい

element.getAttribute("value") 
+0

[at] data-bindはデータモデルをhtml要素にバインドするためにknockout.jsによって使用される特殊な属性です。 @valueをxpathに使用する必要があるのはなぜですか? –

0

私はあなたがいくつかのタイプミスをしたか、それが意図的なものかどうかは分かりません。以下のコードを参照して、それが役立つかどうかを確認することができます

By xpath = By.xpath(".//div[@id='product-list']//div[contains(@class, 'product-list-item')]/input[@data-bind='value: Product Name']"); 
WebElement element = browser.getWebDriver().findElement(xpath); 
element.getAttribute("value"); 
+0

@ data-bindはデータモデルをhtml要素にバインドするためにknockout.jsによって使用される特殊な属性ですが、これは間違った方法ですし、element.getAttribute( "私は値を必要としません、私はそれをテストする必要があります。 –

関連する問題