2016-04-05 4 views
0

Mein Test sendet Formular und überprüft den Nachrichtenstatus. Aber wenn dieser Zustand ist erfrischend, aus den „neuen“ bis „gesendet“, von „gesendet“ auf „empfangen“ und Selen Kontrollen für das Element, erhalte ich die Fehlermeldung:Element nicht im Cache gefunden ... Wie kann ich damit umgehen, wenn ich nicht weiß, ob Element verfügbar ist, wenn ich es überprüfe? C# webdriver

element not found in the cache

Vielleicht ist die Seite, da es geändert wurde nachgeschlagen. Wie kann ich mit dieser Situation umgehen?

Der Code, den ich jetzt habe:

Driver.FindElement(By.CssSelector("button[value=Send]")).Click(); 
wait.Until(x => x.FindElement(By.Id("messageState"))); 
string state1 = Driver.FindElement(By.Id("messageState")).Text; 
while (state1 == "New") 
{ 
    wait.Until(x => x.FindElement(By.Id("messageState"))); 
    state1 = Driver.FindElement(By.Id("messageState")).Text; 
    Thread.Sleep(3000); 
} 
wait.Until(x => x.FindElement(By.Id("messageState"))); 
string state2 = Driver.FindElement(By.Id("messageState")).Text; 
while (state2 == "Sent") 
{ 
    wait.Until(x => x.FindElement(By.Id("messageState"))); 
    state2 = Driver.FindElement(By.Id("messageState")).Text; //Error line 
    Thread.Sleep(3000); 
} 
wait.Until(x => x.FindElement(By.Id("messageState"))); 
string state3 = Driver.FindElement(By.Id("messageState")).Text; 
Assert.IsTrue(state3.Contains("Received")); 

Antwort

1

Sie können versuchen, ExpectedConditions zu verwenden, insbesondere TextToBePresentInElementLocated, für diese

Driver.FindElement(By.CssSelector("button[value=Send]")).Click(); 

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 

wait.Until(ExpectedConditions.TextToBePresentInElementLocated(By.Id("messageState"), "Sent")); 
wait.Until(ExpectedConditions.TextToBePresentInElementLocated(By.Id("messageState"), "Received")); 

Dies wird für 10 Sekunden, bis das Element warten bis "enthalten gesendet "und" Empfangen ".

1

Ich würde Setup den Kellner die verbrauchte Ausnahme zu überspringen und den Text in einem Kellner zu erhalten:

// silence the stale exception 
wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException)); 

// wait for text "New" 
wait.Until(x => x.FindElement(By.Id("messageState")).Text == "New"); 

// wait for text "Sent" 
wait.Until(x => x.FindElement(By.Id("messageState")).Text == "Sent"); 

// get the final text 
string state3 = wait.Until(x => x.FindElement(By.Id("messageState")).Text); 
Assert.IsTrue(state3.Contains("Received")); 
Verwandte Themen