Подождите, пока класс не будет удален из div - PullRequest
0 голосов
/ 17 января 2020

Я использую Selenium с C# для тестирования веб-приложения. У нас есть реализация, которая при загрузке раздела страницы добавляет класс в div раздела, и после загрузки раздела класс div удаляется из div. Например:

До

<div class="tabs-container spinner">

После:

<div class="tabs-container">

Я пытаюсь добавить Ожидание, пока счетчик не будет удален из класса div. Я попытался использовать

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector("spinner")));

', однако это не работает.

Есть идеи, как разобраться с этим делом?

Ответы [ 4 ]

0 голосов
/ 20 января 2020

Вы можете создать быстрый хакерский метод с помощью времени l oop.

    ...
    CheckLoaded("div[class*='spinner']", 5);

    public void CheckLoaded(string css, int timeout)
    {
        timeout = timeout * 1000;
        int count=0;
        while(driver.FindElements(By.CssSelector(css) > 0 || count < timeout))
        {
             Thread.Sleep(1000);
        }
    }
0 голосов
/ 17 января 2020

Чтобы дождаться удаления загрузчика , вы должны вызвать WebDriverWait для InvisibilityOfElementLocated(), и вы можете использовать любую из следующих стратегий локатора :

  • CssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector("div.tabs-container.spinner")));
    
  • XPath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.XPath("//div[@class='tabs-container spinner']")));
    
0 голосов
/ 17 января 2020

Вы можете написать пользовательскую функцию для ожидания изменения атрибута class, например

public static Func<IWebDriver, string> waitForChangeInAttribute(By locator, string attribute, string notValue) {
    return (driver) => {
      try {
          var value = driver.FindElement(locator).GetAttribute(attribute);
          return value == notValue ? null : value;
      }
      catch (NoSuchElementException) {
          return null;
      }
      catch (StaleElementReferenceException) {
          return null;
      }
    };
}

И использовать / вызывать как

string valueBefore = driver.FindElement(By.xpath("//div[contains(@class, 'tabs-')]")).GetAttribute(attribute);

wait.Until(waitForChangeInAttribute(By.xpath("//div[contains(@class, 'tabs-')]"), "class", valueBefore));

Примечание: пожалуйста, примите заботиться о одинарных и двойных кавычках, когда я печатаю с клавиатуры мобильного телефона

0 голосов
/ 17 января 2020

Поскольку вы используете css селектор. Попробуйте с помощью .classname

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector(".spinner")));

Или Вы можете проверить, что .spinner класс отсутствует при использовании ElementIsVisible

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.CssSelector("div.tabs-container:not(.spinner)")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...