Более общим решением, чем ожидание элемента, было бы ожидание закрытия всех соединений с сервером.Это позволит вам дождаться завершения всех вызовов ajax, даже если они не имеют обратного вызова и, следовательно, не влияют на страницу.Более подробную информацию можно найти здесь .
Используя C # и jQuery, я создал следующий метод для ожидания завершения всех вызовов AJax (если у кого-то есть более прямые способы доступа к переменным JS изC #, пожалуйста, прокомментируйте):
internal void WaitForAjax(int timeOut = 15)
{
var value = "";
RepeatUntil(
() => value = GetJavascriptValue("jQuery.active"),
() => value == "0",
"Ajax calls did not complete before timeout"
);
}
internal void RepeatUntil(Action repeat, Func<bool> until, string errorMessage, int timeout = 15)
{
var end = DateTime.Now + TimeSpan.FromSeconds(timeout);
var complete = false;
while (DateTime.Now < end)
{
repeat();
try
{
if (until())
{
complete = true;
break;
}
}
catch (Exception)
{ }
Thread.Sleep(500);
}
if (!complete)
throw new TimeoutException(errorMessage);
}
internal string GetJavascriptValue(string variableName)
{
var id = Guid.NewGuid().ToString();
_selenium.RunScript(String.Format(@"window.$('body').append(""<input type='text' value='""+{0}+""' id='{1}'/>"");", variableName, id));
return _selenium.GetValue(id);
}