selenium StaleElementReferenceException在调用SendKeys时发生

时间:2017-10-25 13:25:19

标签: javascript selenium

当它执行发送键时,您将看到该城市的名称显示,并清除所有该命令。我把等待添加只是为了检查。有办法解决这个问题吗?它不会失败,因为它找到了该字段,然后清除它。它不能是javascript,因为我没有离开该字段,我还没有发现任何代码被'keystroke'调用。

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

上面的城市是一处房产。

1 个答案:

答案 0 :(得分:0)

我通常会等待元素可见,活跃且可编辑,而不仅仅是因为它存在于DOM中。

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

有关详细信息,请参阅ExpectedConditions#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 ){
   }
}