2017-10-26 12 views
0

ユーザー入力によってページ上でタスクを自動化するフォームがありますが、ページ上の要素とのやり取りに問題があります。動的な名前と要素数を持つCheckBoxListです。 HTMLは次のようになります。Selenium C#で変数またはラベルでボックスをチェックする

<ol id="ratingModification_SupplierContact_content"> 

        <label><input type="checkbox" name="searchQuery.vehicleGroups[0].isSelected" value="on" class="vehGrp">&nbsp;abcd ef (ghi)</label> <br> 

        <label><input type="checkbox" name="searchQuery.vehicleGroups[1].isSelected" value="on" class="vehGrp">&nbsp;jklm no (pqr)</label> <br> 

       </ol> 

ここで、「abcd ef(ghi)」は最初のチェックボックスのラベルです。

私はすでに要素からラベルを抽出し、ここではユーザーからの助けを借りて設計された配列にそれらを置くのボタンがあります。

var vehicleGroupInputElements = Builder.Driver.FindElements(By.ClassName("vehGrp")); 

    var vehicleGroupNames = vehicleGroupInputElements.Select(f => f.FindElement(By.XPath(".."))).Select(f => f.Text).ToArray(); 

をそして私は私のフォームのにCheckedListBox移入:

vehicleGroupList.Items.AddRange(vehicleGroupNames); 

しかし、ユーザーの選択をページに戻そうとすると、問題が発生します。私はIndexOf()とClassNameを使ってインデックスに基づいて選択しようとしましたが、それを動作させるために構文を理解することはできません。失敗した例:

foreach (int userChecks in vehicleGroupList.CheckedItems) 
     { 
      int checkIndex = vehicleGroupList.Items.IndexOf(userChecks); 
      var checkTarget = Builder.Driver.FindElements(By.ClassName("vehGrp")); 
      checkTarget.IndexOf(checkIndex).Click(); 
     } 

int checkIndex cantがIWebElementに変換できないため、コンパイルできません。また、xpathでインデックスを扱う文字列を作成しようとしましたが、要素を見つけることができないか、または複合名の例外をスローしません。失敗例:

foreach (int userChecks in vehicleGroupList.CheckedItems) 
     { 
      int checkIndex = vehicleGroupList.Items.IndexOf(userChecks); 
      string elementTarget = "searchQuery.vehicleGroups[" + checkIndex + "].isSelected"; 
      var checkTarget = Builder.Driver.FindElements(By.XPath(string.Format("//option[contains(text(), {0}]", elementTarget))).Click(); 
     } 

は、私はまた、上記と同様のXPathを介したラベルによって要素を検索しようとしたが、それはそれを見つけることはありません。要素を見つけてチェックする正しい方法は何ですか?

+0

を次のように各チェックボックスを順番にクリックしますか? –

+0

私はそれがうまくいくと思います。私は 'foreach(私のフォーム上のチェックされた項目)ページ上の対応するチェックボックスをクリックするつもりだった。しかし、それらを一度にすべてクリックすることもできます。 –

答えて

0

ちょうどXPath構文に見て、答えを見つけました。検査モードでChromeの 'copy Xpath'機能を使用すると、必要なパスが見つかり、入力要素を正常にクリックしました。

次のように最初の入力の例XPathがある(ラベルのHTMLに気づく[インデックス]はC#はカウントなる方法より1以上である。)

//*[@id="ratingModification_SupplierContact_content"]/label[1]/input 

、溶液

//Retrieves the checked items from the form and sends them to the page. 
     foreach (object checkedItem in vehicleGroupList.CheckedItems) 
     { 
      //Gets the index of the checked items. 
      int checkedIndex = vehicleGroupList.Items.IndexOf(checkedItem); 
      //Adds 1 to the index to match format of the page HTML. 
      checkedIndex++; 
      //Puts the index+1 into a string. 
      string indexText = checkedIndex.ToString(); 
      //Finds the element by index+1. 
      var clickTarget = Builder.Driver.FindElement(By.XPath(string.Format("//*[@id='ratingModification_SupplierContact_content']/label[" +indexText+ "]/input"))); 
      clickTarget.Click(); 
0

あなたが使用することができ、それぞれのチェックボックスをクリックします:

var vehicleGroupInputElements = Builder.Driver.FindElements(By.ClassName("vehGrp")); 

foreach (IWebElement checkbox in vehicleGroupInputElements) 
{ 
    checkbox.Click(); 
} 
+0

ちょうど試しましたが、コンパイルするだけでなく、ページのすべてのボックスをチェックします。 –

+0

それはあなたが望むものではありませんか?あなたは何をしたいですか? –

+0

1)WebページのCheckBoxListのすべての項目を含むフォームのCheckedListBoxに値を設定します。 (作品) 2)ユーザーがフォーム内の1つ以上のボックスをチェックします。 (作品) 3)ユーザーがチェックした項目は、ページでチェックされています。 (まだ動作しません) –