在缓存中找不到元素..当我检查时不知道元素是否可用时,该如何处理?c#网络驱动程序



我的测试是提交表单并检查消息状态。但是,如果该状态从"new"刷新为"send",从"sended"更新为"received",并且selenium检查元素,我会收到错误:

在缓存中找不到元素

也许这个页面在被查找后发生了变化。我该如何处理这种情况?

我现在拥有的代码:

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"));

您可以尝试为使用ExpectedConditions,特别是TextToBePresentInElementLocated

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"));

这将等待10秒,直到元素包含"已发送"one_answers"已接收"。

我会设置服务员跳过过时的异常,并在服务员中获取文本:

// 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"));

最新更新