Селен StaleElementReferenceException, возникающий при вызове SendKeys

1

Когда он будет отправлять ключи, вы увидите имя города и очистите все от этой команды. У меня было ожидание, добавленное просто для проверки. Любой способ обойти это? Это не подводит, потому что оно находит поле, а затем очищает его. Это не может быть 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);
}

Город выше - это собственность.

  • 0
    Можете ли вы связать сайт?
  • 0
    К сожалению не могу. Это внутреннее и имеет защиту PW
Показать ещё 2 комментария
Теги:
selenium

1 ответ

0

Обычно я жду, пока элемент будет видимым, активным и редактируемым, а не только тем, что он существует в 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 ){
   }
}
  • 0
    Извините, что потребовалось так много времени, чтобы ответить. Семейная чрезвычайная ситуация и просто попытался сделать это сейчас ... ничего из этого не сработало, потому что он принимает данные, но в то же время, как и ключи отправки, он удалял их ... так в последнем примере выше, он вставил значения, удалил, вставил, удалил, 5 раз ... самая странная вещь. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню