Селен C#: Есть ли способ дождаться скрытия наложения загрузки, прежде чем продолжить?

#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);