selenium StaleElementReferenceException 在调用 SendKeys 时发生



当它执行发送密钥时,您将看到城市的名称显示并清除,所有这些都来自该命令。我添加了等待只是为了检查。有什么方法可以解决这个问题吗?它不会失败,因为它会找到该字段,然后将其清除。它不可能是javascript,因为我没有离开该字段,也没有发现任何代码被"击键"调用。

try
{
    var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
    wait.Until(ExpectedConditions.ElementExists((By.Id("city"))));
    var city = Driver.Instance.FindElement(By.Id("city"));
    //Task.Delay(10000).Wait();
    city.SendKeys(City);
    //Task.Delay(10000).Wait();
}
catch (StaleElementReferenceException ex)
{
    var city = Driver.Instance.FindElement(By.Id("city"));
    City.SendKeys(City);
}

上面的城市是一个财产。

我通常等待元素可见、活跃和可编辑,而不仅仅是它在 DOM 中的存在。

wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city"))));

有关详细信息,请参阅预期条件#elementToBeClickable。


似乎在清除字段时触发了onchange或oninput事件,并且一些javascript代码修改了此元素。

首先尝试此代码 - 每次等待元素,然后再对其执行每个操作:

wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).clear();
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).SendKeys(City);

如果仍然不起作用,请使用蛮力方法 - 在循环中尝试几次:

wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).clear();
for( int i = 5; i >=0; i--){
  try{  
    wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).SendKeys(City);
    break;
  }catch( StaleElementReferenceException ex ){
    if( i <= 0 ){
       throw ex;
    }else{
       // swallow the exception, wait some time and try again
       Utils.silentSleep( 500 );
    }
}

其中 Utils.silentSleep 是:

static void silentSleep( long ms ){
   try{
     Thread.sleep( ms );
   }catch( Exception ex ){
   }
}

最新更新