Итак, есть несколько подходов:
- Ожидание выполнения ajax. Если элементы загружаются с помощью ajax, вы можете использовать этот код:
public void WaitForAjax(){
var miliSecondsToWait = 15000;
bool ajaxIsComplete = false;
while (!ajaxIsComplete && miliSecondsToWait > 0) // Handle timeout somewhere
{
ajaxIsComplete = (bool)(Driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
Thread.Sleep(200);
miliSecondsToWait -= 200;
}
}
Самое простое решение, но это не рекомендуемый метод: просто переведите вашу ветку в спящий режим:
Thread.Sleep(10000).
Ожидание в течение 10 секунд (не рекомендуемый метод) Не забудьте импортировать систему. Нарезание резьбы;
Напишите пользовательскую функцию для ожидания, когда можно щелкнуть элемент, например:
protected Func<IWebDriver, bool> ButtonToBeSuccessfullyClicked(IWebDriver driver, By locator)
{
Func<IWebDriver, bool> func = (_driver) =>
{
if (E(locator).Displayed)
{
E(_continueButton).Click();
return false;
}
else
{
return true;
}
};
return func;
}
с подходом, вы можете вызвать эту функцию в ожидаемых условиях
Driver.Until(ButtonToBeSuccessfullyClicked(Driver, _continueButton));
Обратите внимание, если вы используете SeleniumExtras.WaitHelpers.ExpectedConditions, функция не будет работать, вам придется написать собственную реализацию.
Это мой предпочтительный способ. Если во время клика выдается исключение, вы можете заключить клик в try-catch. поэтому результат будет выглядеть следующим образом:
protected Func<IWebDriver, bool> ButtonToBeSuccessfullyClicked(IWebDriver driver, By locator)
{
Func<IWebDriver, bool> func = (_driver) =>
{
if (E(locator).Displayed)
{
try {
E(_continueButton).Click();
return false;
} catch ()
{
return true;
}
}
else
{
return true;
}
};
return func;
}
, пожалуйста, перепроверьте, что должно быть возвращено функцией true или false для ожидаемого условия, потому что я не запустил код, я пишу это согласнона мою память (которая может помнить это неправильно)
Как уже упоминалось в вопросе и немного грубо напомнил мне пользователь =). У вас не было никаких исключений при нажатии на элемент. Другое решение - сравнить HTML полностью работающего элемента, когда он работает (кликабелен), и того же элемента, но в начале, когда он не работает (не кликабелен). Если элемент имеет какие-либо различия в HTLM, имени класса css, стиле css и т. Д., Вы можете дождаться этого изменения в своем тестовом коде.