2017-05-15 17 views
1

仮想化を使用してアイテムをHTMLからJavaScriptにロードするigComboドロップダウンコントロールがあります。ドロップダウンの最初の展開時に、項目の完全なリストはリスト/ HTMLにはなく、最初の10項目についてのみです。ユーザーがスクロールダウンすると、新しい項目がHTMLにロードされます。だから、単純にSelecElement.SelectByTextを使うことはできません。あるいは、単純な関数を使って、HTMLからforループ内のすべてのli要素を格納することはできません。クリックしたい項目がインデックス11以上にある場合、 HTMLはまだありません。ドロップダウン(igCombo)要素を1ページずつリストの末尾までスクロールします。

これを攻撃する唯一の方法は、forループを使用してHTMLの初期項目を格納することです。次に、ユーザーが渡したitemToClick変数の値がこのforループ内の項目と一致する場合は、その項目をクリックします。それ以外の場合は、1ページ全体をスクロールして次の10項目をロードします。 itemToClick値がスクロールした後のアイテムのいずれかと一致するまでループを繰り返すか、またはスクロールがドロップダウンの下部に達するまでそのループを繰り返し、その時点でそのアイテムが存在しないことをユーザに伝えます。

私のメソッドコールはここにあります。私はドロップダウンにリストの一番下にある「MTV」、をクリックしていることに注意してください:ここで

ClickListItemByNameVirtualization(driver, dropDownElem, scrollBarElem, "MTV"); 

は方法です。 まだコメントがありませんコメントを参照してください。それは私が助けが必要なものです。私は、カップルの事を試してみましたが、私は必要なもののために動作するコードを考え出すカント:

public void ClickListItemByNameVirtualization(IWebDriver browser, IWebElement divElemOfScrollBar, IWebElement ulElemOfDropDown, string itemName) 
{ 
    bool topOfList = true; 

    do 
    { 
     if (topOfList == false) 
     { 
      // NOT CODED YET: I need a method that scrolls down page by page within a dropdown frame. For reference of how I scroll statically inside a 
      // frame, see my ScrollToWithinFrame method that I referenced at the bottom of this post 
      ScrollDownPageWithinDropdown(); 
     } 

     topOfList = false; 

     // Store all li elements within the unordered list 
     var liElems = ulElemOfDropDown.FindElements(By.TagName("li")).ToList(); 

     // Loop through all list items 
     foreach (var liElem in liElems) 
     { 
      // if the current list item's text value in the for loop equals the users passed parameter itemName 
      if (liElem.Text == itemName) 
      { 
       liElem.Click(); 
       Thread.Sleep(0200); 
       return; 
      } 
     } 
     // NOT CODED YET: I need code to add to ScrollBarEnd that returns true or false. Only do the above code if ScrollBarEnd is false 
    } while (!ScrollBarEnd()); 
} 

そして最後に、参考のために、ここでフレーム内をスクロールするために私のコードは次のとおりです。

public void ScrollToWithinFrame(IWebDriver browser, IWebElement divElemOfScrollBar, int xOrYCoordinate, string HorizontalOrVertical) 
{ 
    IJavaScriptExecutor js = (IJavaScriptExecutor)browser; 

    if (HorizontalOrVertical == "Vertical") 
    { 
     js.ExecuteScript("arguments[0].scrollTop = arguments[1];", divElemOfScrollBar, xOrYCoordinate); 
    } 

    if (HorizontalOrVertical == "Horizontal") 
    { 
     // Scroll inside the popup frame element vertically. See the following... 
     // http://stackoverflow.com/questions/22709200/selenium-webdriver-scrolling-inside-a-div-popup 
     js.ExecuteScript("arguments[0].scrollLeft = arguments[1];", divElemOfScrollBar, xOrYCoordinate); 
    } 
} 

答えて

0

あなたはウェイターは、リストの最後に新しい<li>要素を待って無限ループを使用することができます。

public void ClickListItemByNameVirtualization(IWebDriver browser, IWebElement divElemOfScrollBar, IWebElement ulElemOfDropDown, string itemName) 
{ 
    var wait = new WebDriverWait(browser, TimeSpan.FromSeconds(5)); 
    IWebElement lastLi = null; 

    while (true) { 

     // wait for a new li element at the end and store all li elements 
     var liElems = wait.Until<ReadOnlyCollection<IWebElement>>(drv => { 

      var elems = ulElemOfDropDown.FindElements(By.TagName("li")); 

      return (elems.Count > 0 && elems[elems.Count - 1] != lastLi) ? elems : null; 
     }); 

     // store the last element 
     lastLi = liElems[liElems.Count - 1]; 

     // Loop through all list items 
     foreach (var liElem in liElems) { 
      // if the current list item's text value in the for loop equals the users passed parameter itemName 
      if (liElem.Text == itemName) { 
       liElem.Click(); 
       return; 
      } 
     } 

     // scroll the container to the end 
     ((IJavaScriptExecutor)browser).js.ExecuteScript(
      "arguments[0].scrollTop = (-1 >>> 1);", divElemOfScrollBar); 
    } 
} 
+0

ありがとうございました。これはうまくいくかもしれませんが、スクロールするJavaScriptは私のためにリストの最後までスクロールしています。ページをスクロールするコードはありません –

0

は、私はそれを行うには醜い方法を考え出しました。私は、スクロールバーの目に見える高さを知っているので、目に見えるアイテム(スクロールごとにHTMLにロードされるアイテム)が表示されます。私は、その目に見える高さ(387ピクセル)を使って、forループの各ステップをスクロールします最大の高さに達するまで。ここにあります。私は2日までこれを答えとしてマークしません。他の人にもっと直感的なものを試してもらうこともできます。

public static void ClickListItemByNameVirtualization(IWebDriver browser, IWebElement ulElem, IWebElement divElem, string itemName) 
     int scrollAmount = 0; 
     IJavaScriptExecutor js = (IJavaScriptExecutor)browser; 

     ProgramLibraryPage PL = new ProgramLibraryPage(browser); 
     PL.ChangeProgFormSelectProgDrpDnBtn.Click(); 

     // Scroll to the top of the list 
     js.ExecuteScript("return arguments[0].scrollTop = 0;", divElem); 


     for (var i = 0; i < 1000; i++) 
     { 
      List<IWebElement> liElems = ulElem.FindElements(By.TagName("li")).ToList(); 

      foreach (var liElem in liElems) 
      { 
       // if the current list item's text value in the for loop equals the users passed parameter itemName 
       if (liElem.Text == itemName) 
       { 
        liElem.Click(); 
        Thread.Sleep(0200); 
        return; 
       } 
      } 

      scrollAmount = scrollAmount + 387; 

      object scrollMaxHeight = js.ExecuteScript("return arguments[0].scrollHeight;", divElem); 

      var scrollMaxHeightInt = Convert.ToInt32(scrollMaxHeight); 

      if (scrollMaxHeightInt > scrollAmount) 
      { 
       ElemSet.ScrollToWithinFrame(browser, divElem, scrollAmount, "Vertical"); 
      } 
     } 
} 
+0

次のコードを使用してみます: 'js.ExecuteScript(" arguments [0] .scrollIntoView(true) "、lastElem);' 'lastElem'はドロップダウンリストの現在の最後の要素です。ダウンリスト。 – kushal

関連する問題