Selenium StaleElementReferenceException при перезагрузке страницы (FluentWait) - PullRequest
0 голосов
/ 28 апреля 2020

Я написал следующую функцию:

    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), но я скорее избегаю этого, может кто-нибудь помочь мне найти лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...