Я написал следующую функцию:
public static IWebElement FluentWait(By locator) {
var fluentWait = new DefaultWait<IWebDriver>(WebDriver.GetDriver)
{
Timeout = TimeSpan.FromSeconds(30),
PollingInterval = TimeSpan.FromMilliseconds(5)
};
fluentWait.IgnoreExceptionTypes(typeof(NoSuchElementException),
typeof(StaleElementReferenceException),
typeof(ElementNotInteractableException),
typeof(ElementClickInterceptedException));
fluentWait.Until(ExpectedConditions.ElementToBeClickable(locator));
return fluentWait.Until(x=> x.FindElement(locator));
}
С помощью этой функции я могу сделать что-то вроде:
FluentWait(By.Id("myId")).Click();
Проблема, однако, заключается в том, что мой Сбой функции FluentWait()
, потому что Selenium работает слишком быстро и начинает проверять:
fluentWait.Until(ExpectedConditions.ElementToBeClickable(locator));
даже до того, как страница даже начинает перезагружаться, поэтому он всегда находит старый не устаревший элемент и Until()
становится истинным .
Перезагрузка страницы выполняется нажатием на кнопку, которая отправляет запрос PATCH и перезагружает страницу, ранее нажималась эта кнопка, я пытаюсь нажать:
FluentWait(By.Id("myId")).Click();
Кроме того, что-то вроде приведенного ниже кода не будет работать по той же причине, что и выше.
wait.Until(driver=>((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Единственное решение, о котором я могу подумать сейчас, - это использовать Thread.Sleep(n)
, но я скорее избегаю этого, может кто-нибудь помочь мне найти лучшее решение.