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