C# Selenium方法WaitUntiltExtToBePresentElement失败

C# Selenium方法WaitUntiltExtToBePresentElement失败,c#,selenium,automated-tests,C#,Selenium,Automated Tests,我已将带有文本的标签从MQL更改为SQL值 <label for="stage_label" id="Stage_label"><div class="ms-crm-div-NotVisible">Stage SQL</div>SQL<div class="ms-crm-Inline-GradientMask"></div></label> 同时,如果我尝试调试和检查元素文本,它会在等待一段时间后成功返回SQL

我已将带有文本的标签从
MQL
更改为
SQL

<label for="stage_label" id="Stage_label"><div class="ms-crm-div-NotVisible">Stage SQL</div>SQL<div class="ms-crm-Inline-GradientMask"></div></label>
同时,如果我尝试调试和检查元素文本,它会在等待一段时间后成功返回SQL

       for (int i = 0; i < 5; i++)
       {
         Console.WriteLine(driver.FindElement(
         By.Id("Stage_label")).Text);
         Thread.Sleep(100);
       }
for(int i=0;i<5;i++)
{
Console.WriteLine(driver.FindElement(
By.Id(“Stage_标签”)).Text);
睡眠(100);
}
MQL MQL MQL SQL


为什么Selenium方法在这种情况下不起作用?

因为@CodingKuma建议表单在值更新期间刷新,元素从DOM中消失。 所以它需要等待元素暂停,然后等待元素出现。

这个怎么样

var wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(30000));
var element = driver.FindElement(By.Id("Stage_label"))
wait.Until(ExpectedConditions.TextToBePresentInElement(element, "SQL"));

好的,既然你确认了包含元素正在被销毁和重新创建,我可以提供更好的帮助。您应该可以只使用“TextToBePresentElementLocated”来代替。这将采用By对象而不是元素本身

var wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(30000));
wait.Until(ExpectedConditions.TextToBePresentInElementLocated(By.Id("Stage_label"), "SQL"));

你说它失败是什么意思?它是否会引发
NoTouchElementException
TimedoutException
?它会引发“30秒后超时”异常,除非整个元素可能正在被销毁和重新创建?在测试中,添加一个变量以在循环之前获取元素,并获取该元素上的文本,而不是每次都获取新元素。这会告诉你是否有新元素。这是打字错误吗
driver.FindElement
处于等待状态vs
WebDriverManager.driver.FindElement
或者只是因为它们处于不同的位置classes@GaurangShah这是个打字错误。意思是同一个物体。我现在就修
var wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(30000));
wait.Until(ExpectedConditions.TextToBePresentInElementLocated(By.Id("Stage_label"), "SQL"));