2016-12-21 19 views
0

私は、ページオブジェクト内のtext_fieldを使用しての中の最初の<input>フィールドを識別したい次のHTMLのWebページで作業しています。XPathを使用して、入力フィールドをIDなしで検索する方法

<div id="131:"> Please enter your name: 
<span class="autocompspan " style="position:static;"> 
    <input style="position: static;" class="autocompinput yui-ac-input" id="132:" name="132:" 
    onfocus="juic.fire(&quot;132:&quot;,&quot;_focus&quot;,event);" 
    onchange="juic.fire(&quot;132:&quot;,&quot;_despatchChange&quot;,event);" 
    onblur="juic.fire(&quot;132:&quot;,&quot;_blur&quot;,event);" size="60" 
    onkeydown="juic.fire(&quot;132:&quot;,&quot;_onkeydown&quot;,event);" 
    onkeyup="juic.fire(&quot;132:&quot;,&quot;_onkeyup&quot;,event);" aria-disabled="false" value="" 
    role="combobox" aria-autocomplete="list" aria-owns="132:_divList" 
    aria-activedescendant="132:_divAD" findtype="proxy" delimchar="" hideusername="false" 
    fetchusername="false" autocomplete="off" type="text"> 
    <input value="" id="132:_hidden" name="132:_hidden" type="hidden"> 
</span> 
</div> 

フィールドを識別するために:id => '132:'を使用すると正常に動作します。私。 text_field(:target_user_name, :id => '132:')が動作します。

問題は、このHTMLはいつもidが一貫要素を識別するために依拠することはできません使用して<input>フィールドid同じ値を生成していない基本的なアプリ(SAP)によって生成されていることです。 したがって、上記のHTMLでは、この<input>フィールドを確実に見つける方法について他にどのような方法がありますか。

私は以下のことを試しましたが、いずれも動作しません。彼らのほとんどは、要素の位置を待っている時間があります。

text_field(:target_user_name, :xpath => "//*[@class='autocompinput yui-ac-input' and @role = 'combobox']") 
text_field(:target_user_name, :xpath => "//*[@class='autocompinput' and @role = 'combobox']") 
text_field(:target_user_name, :xpath => "//span/input[@class='autocompinput yui-ac-input' and @role = 'combobox']") 
text_field(:target_user_name, :xpath => "//input[@class='autocompinput yui-ac-input' and @role = 'combobox']") 
text_field(:target_user_name, :class => 'autocompinput yui-ac-input') 

+0

ユーザーとして、 ?このテキストフィールドが何であるかをユーザーに知らせるための、ユーザーが見ることのできるテキストがある可能性があります。私はそのテキストと、このフィールドとの関係を使って識別を行います。 –

+0

入力を囲むスパンを囲むフィールドラベルを持つdivがあります。 – BobL

+0

上記のコメントを再入力してください - XPATHのように見えて、その場合は入力フィールドが見つかりますか? XPATHSは、入力フィールドの属性が正しく機能すると思っていたでしょうか。 – BobL

答えて

0

要素が一意に識別可能な属性を持っていない場合は、あなたがその周りの要素になっているはずですが。この場合、ユーザーがフィールドの目的を識別するのに役立つユーザーの視覚的なテキストがあります。同じテキストを使用してWatirの要素を識別することができます。

周囲divのみラベルテキストが含まれているとして、あなたはそのテキストによってそのdivを検索し、その中に唯一のテキストフィールドを取得することができます:ページ・オブジェクトのアクセサとして

browser.div(text: 'Please enter your name:').text_field 

を:

text_field(:target_user_name) { div_element(text: 'Please enter your name:').text_field_element } 
+0

ありがとうジャスティン私は今夜試してみましょう。一貫性のために、可能であれば、私はページオブジェクトのヘルパーを排他的に使用しようとしています。これを達成するためにtext_fieldヘルパーを使用する方法はありますか?そうでなければ、私はbrowser.divを使用します – BobL

+0

はい、あなたはブロックを定義することによってアクセサで同様に行うことができます。例が追加されました。 –

+0

Hmmm - この場合でもdivは見つかりません。私は "browser.div(テキスト: 'ターゲットユーザー名を入力してください:')。text_field"を検索し、 "{:text =>"を待って30秒後にタイムアウトしました。 "、 tag_name => "div"}を探します(Watir :: Exception :: UnknownObjectException)。 " 'ターゲットユーザー名を入力してください:'は元の投稿の私の例に似たdivの実際のテキストです。 – BobL

0

まず、WatirはXPATHを使用する必要がないように設計されています。

これはページ上にいくつの要素/ IDがあるかによって異なりますが、正規表現を使用すると動的に生成されるIDでよく機能することがわかりました。だから、IDを取得し、他の場所でそれを使用するか:

id = browser.text_field(id: /\d\d\d/).tr(':', '') 

か、単にそれを直接使用します。

text_field(:target_user_name, id: /\d\d\d:/) 
+0

私はXPATHを使用する必要がないことを望んでいましたが、その周りに道を見つけることができません。私は正規表現を使用すると考えていましたが、** id = \ '\ d \ d \ d:\ "**パターンに一致する32個のフィールドがあります。しかし、それらは動作しません... – BobL

+0

そして、#sに追加されたものだけでなく、さまざまなid#があります(例えば、 '132:_hidden'のような)? – titusfortner

+0

値は3桁で始まる75のIDです大腸が続き、そのうち32丁が3桁で、その後にコロンが続き、残りの43桁にコロンが続きます。 – BobL

0

この場合は、「あなたの名前を入力してください:」というテキストの後ろにあるxpath:

一般に、一意の識別子を持たないフィールドに遭遇した場合は、静的なテキストやフィールドに頼り、次に、先行するようなxp​​ath関数を使用することができます。

+0

ありがとう、これを試してみてください。テキストが「OK」のこのテキストフィールドの後に最初のボタンを見つけるにはどうすればよいですか? //次の:: buttonを使用しますか?[text()= 'OK'] – BobL

+0

私は、このテキストが「OK」であるこの** div **フィールドの後にどのように最初のボタンを見つけるのですか? //後で:: button [text()= 'OK']を使うでしょうか? – BobL

+0

はい、間違いなくこれを使うことができますが、xpath関数を使う前にid、nameなどの一意の識別子を試してください。 – SelThroughJava

関連する問題