Набор логически связанных полей input
имеет событие onchange
. После перебора полей и изменения их значений некоторые обновляются корректно, а некоторые нет из-за того, что сделано onchange
event.
В тот момент, когда событие onchange
запускается в поле, оно начинает некоторую обработку (включая другие связанные поля), сохраняет где-то значение и очищает другие связанные поля, если они не были ранее обработаны их собственным событием onchange
.
Я мог бы положить поток в спящий режим на произвольное количество времени, но это не выглядит хорошо. Было бы просто угадывать, сколько времени уйдет на обработку, и выбирать между тратой времени в щедром сне или наличием сценария, который может прервать истечение времени ожидания.
Есть ли способ узнать, когда код JavaScript (который вызывается событием onchange
) завершил свою работу?
Оригинальный код
Wait<WebDriver> wait = new WebDriverWait(driver, 25, 500);
for(int i = 1; i <= fieldCount; i++) {
elementId = "field$" + i;
wait.until(ExpectedConditions.elementToBeClickable(By.id(elementId)));
driver.findElementById(elementId).sendKeys(data);
//The mess happens if I don't sleep
Thread.sleep(3000);
}
выход
со сном: Field1
: _w_
... Field2
: _x_
... Field3
: _y_
... FieldN
: _z_
Без сна: Field1
: _w_
... Field2
: ___
... Field3
: _y_
... FieldN
: ___
Примечания:
Я столкнулся с некоторыми проблемами, поэтому думаю, что стоит упомянуть уроки, извлеченные в кратких заметках:
ПРЕДУПРЕЖДЕНИЕ : не смешивать неявные и явные ожидания.
Используйте WebDriverWait
(специализация FluentWait
) вместо FluentWait
, если только у вас нет особых требований. Например, WebDriverWait
игнорирует NotFoundException
(суперкласс NoSuchElementException
) по умолчанию. См. Рекомендация .