2016-07-29 10 views
0

So ist mein Problem, wie folgt, ich versuche, alle Elemente auf der Seite zu überprüfen und element.GetAttribute("class") == expectedClass zu überprüfen. Hier ist der CodeStaleElementException innerhalb einer foreach-Schleife von IWebElements C#

var feedback = Driver.FindElements(AuctivaSalesPageModel.ViewFeedbackSelector); 
      var attempts = 0; 
      foreach (IWebElement element in feedback) 
      { 
       while (attempts < 3) 
       { 
        try 
        { 
         Assert.AreEqual("leaveFeed actionTaken", element.GetAttribute("class")); 
         attempts = 0; 
         break; 

        } 
        catch (StaleElementReferenceException) 
        { 
         Assert.AreEqual("leaveFeed actionTaken", element.GetAttribute("class")); 
         attempts = 0; 
         break; 
        } 
        catch (AssertionException) 
        { 
         System.Threading.Thread.Sleep(3000); 
         Driver.Navigate().Refresh(); 
         AuctivaSalesPage.WaitForElementVisible(Driver, AuctivaSalesPageModel.TotalNumberOfSalesSelector); 
         AuctivaSalesPage.ScrollToTop(); 
         AuctivaSalesPage.SelectNoFolder(); 
         attempts++; 
        } 

       } 

      } 

Jetzt habe ich bereits auf dem StaleElementException Lesen und ich denke, dass mein Fang und wiederholt Ansatz nutzlos ist, als ob das DOM aktualisiert hat dann das Element in der Liste wird immer abgestanden sein. Ich glaube, was ich hier tun muss, ist das Element mit einer Driver.FindElement() zu refundieren, aber da ich dieses Problem innerhalb einer foreach-Schleife von IWebElements habe, bin ich nicht sicher, wie man den Selektor für das spezifische Element erhält, das nicht wiederholen kann? Sollte ich die Ausnahme abfangen, die Liste neu erstellen und dann die gesamte foreach-Schleife wiederholen? oder gibt es eine Möglichkeit, die Wähler die spezifisch auf die element innerhalb der Schleife zu extrahieren, damit ich etwas entlang der Linien von

Assert.AreEqual("leaveFeed actionTaken", Driver.FindElement(By.someSelector(element.GetSelector)).GetAttribute("class"));

Antwort

0

Ich hoffe, das hilft tun, aber ich hatte ein ähnliches Problem und war in der Lage zu bekommen um ihn herum die folgende Logik verwendet, gewährt es ist nicht der beste Ansatz, aber es funktioniert:

var feedbackCount = Driver.FindElements(AuctivaSalesPageModel.ViewFeedbackSelector).Count(); 
var attempts = 0; 
for(var i = 0; i < feedbackCount; i++) 
{ 
    while (attempts < 3) 
    { 
     var element = Driver.FindElements(AuctivaSalesPageModel.ViewFeedbackSelector).ElementAt(i); 
     //Continue you logic here 
    } 
} 

Hope this Hilfe

+0

Vielen Dank '.ElementAt()' wurde genau das, was ich gesucht habe! –

+0

Kein Problem, froh, dass es funktioniert hat :) –