#c# #.net #selenium #selenium-webdriver #selenium-chromedriver
Вопрос:
Поэтому я создавал различные явные ожидания после выполнения таких задач, как обновление контактной информации, отправка форм и т. Д., Потому что каждый раз, когда я это делаю, на несколько секунд появляется наложение загрузки. Я только что понял, что на каждой странице один и тот же код загрузки. Вместо того, чтобы ждать, пока результаты появятся на странице или появится что-то еще, я просто хочу дождаться, пока это наложение загрузки скроется. Можно ли написать какой-нибудь повторно используемый код, чтобы дождаться, пока это наложение скроется, прежде чем продолжить?
Код наложения:
lt;div id="progress" style="display: none;" role="status" aria-hidden="true"gt; lt;div id="divOverlay"gt;lt;/divgt; lt;div id="divLoading"gt; lt;img id="loading" src="/loading.gif" /gt; lt;/divgt; lt;/divgt;
При отображении загрузки атрибуты div станут:
lt;div id="progress" style="display: block;" role="status" aria-hidden="false"gt; lt;div id="divOverlay"gt;lt;/divgt; lt;div id="divLoading"gt; lt;img id="loading" src="/loading.gif" /gt; lt;/divgt; lt;/divgt;
Ответ №1:
Если ваша версия .net поддерживает ExpectedConditions
, вы можете сразу же использовать приведенное ниже решение
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10)); wait.until(ExpectedConditions.invisibilityOfElementLocated(By.XPath("//div[@id='progress']")));
Если он не поддерживает, то может сработать приведенное ниже решение.
//returns as soon as element is not visible, or throws WebDriverTimeoutException protected void WaitUntilElementNotVisible(By searchElementBy, int timeoutInSeconds) { new WebDriverWait(_driver, TimeSpan.FromSeconds(timeoutInSeconds)) .Until(drv =gt; !IsElementVisible(searchElementBy)); } private bool IsElementVisible(By searchElementBy) { try { return _driver.FindElement(searchElementBy).Displayed; } catch (NoSuchElementException) { return false; } }
и используйте его вот так :
WaitUntilElementNotVisible(By.Id("progress"), 10);