C # Selenium CSS-селектор атрибут не работает - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь запустить тест Selenium, где он ожидает, пока определенный атрибут не получит значение для продолжения, и при проверке в браузере (Проверка кода Ctrl + shift + I , ctrl + F ), он находит элемент с помощью локатора css, но я при запуске теста всегда получаю тайм-аут - и элемент получает желаемое значение до этого времени

  1. Проверено, что локатор css действителен в "проверке кода" и поиска
  2. Попробовал более простые локаторы - он находит идентификатор, но не может найти атрибут и его значение
  3. Погуглил как сумасшедший, чтобы найти решение

Мой код (CMExtensionMethods.IsElementVisible == Ожидаемые условия, делает то же самое):

public static WebDriverWait waitForElement = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
waitForElement.Until(CMExtensionMethods.IsElementVisible(By.CssSelector("#page_progress[style~='display:']")));


public static Func<IWebDriver, IWebElement> IsElementVisible(By identifier) {
           return (driver) =>
           {
               try {
                   return IfElementVisible(driver.FindElement(identifier));
               }
               catch(NoSuchElementException) {
                   return null;
               }
           };
       }
       // Part of the method above
       private static IWebElement IfElementVisible(IWebElement element) {
           return element.Displayed ? element : null;
       }

HTML-код на странице (стиль page_progress изменяется в зависимости от состояния сайта - стиль может быть таким или пустым):

    <div id="page_progress" class="loading-progress" style="display: none;"> 
    </div>
    <div id="page_saveindicator" class="unsaved-changes" style="display: 
     none;"></div>

Ожидание: Код для продолжения сразу после того, как стиль получает значение

Результат: Ничего не найдено, и я получаю ошибку тайм-аута через 5 секунд (как установлено), несмотря на то, что элемент имеет атрибут и значение, которое он должен

Стоит упомянуть - метод IsElementVisible работает - проверено на идентификаторах, а CSS-селекторы используют Class и Id (только)

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Вам не нужно (и не следует) включать style=display:... в свой локатор, чтобы определить видимость. Selenium делает это для вас, когда вы используете .Displayed или ExpectedConditions и ждете видимого. Просто найдите элемент нормально, например, оба ваших элемента имеют идентификатор, поэтому используйте By.Id("page_progress"), например

wait.Until(ExpectedConditions.ElementIsVisible(By.Id("page_progress"));

и Selenium позаботится обо всем остальном.

0 голосов
/ 04 апреля 2019

В селекторе CSS используется неправильный оператор сравнения.

Оператор ~= должен точно соответствовать значению атрибута.

Либо добавьте часть block взначение атрибута или измените оператор сравнения на ^=.

By.CssSelector("#page_progress[style^='display:']")

Дополнительная информация: https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors

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