Не удается найти существующий элемент с Selenium WebDriver - PullRequest
0 голосов
/ 14 февраля 2020

поэтому у меня есть это текстовое поле на странице HTML, которое принимает число от 1 до 100 на модальном поле. Если вы введете число в большое -> появится сообщение об ошибке в div ниже и класс будет присвоен div. То же самое для отрицательных чисел. Ввод текста невозможен, поле остается пустым, а нажатие кнопки «ОК» в модальном поле с пустым полем также вызывает сообщение об ошибке, аналогичное описанному выше.

Когда я проверяю все вручную, все работает нормально и Я могу найти элемент, который имеет класс, который я упоминал ранее.

Когда я автоматизирую это, однако ... Я всегда получаю ошибку: no such element: Unable to locate element: {"method":"css selector","selector":".class"}, когда я проверяю, появляется ли сообщение об ошибке после нажатия Ok с пустым полем.

С номером слишком большой или отрицательный, элемент может быть расположен правильно.

Похоже, что кнопка Ok нажата, но сообщение не появляется. Так что есть швы, чтобы быть разницей в нажатии кнопки вручную и автоматически.

Кто-нибудь из вас когда-нибудь замечал что-то подобное и может дать мне некоторую информацию о том, что может быть причиной этого и как я могу это исправить?

Уже спрашивали некоторых коллег, и ни один из них есть идеи, почему это происходит.

Дайте мне знать, если вам нужна дополнительная информация.

Спасибо

Редактировать:

<div class="classes" width="400px">
  <div class="classes">
    <h4 class="classes">Some text</h4>
    <svg
      stroke="currentColor"
      fill="currentColor"
      stroke-width="0"
      viewBox="0 0 24 24"
      class="classes"
      size="20"
      height="20"
      width="20"
    >
      <path
        d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"
      ></path>
    </svg>
  </div>
  <div class="classes">
    <form novalidate="" class="classes">
      <h3 class="classes">Some text</h3>
      <div class="">
        <div class="classes">
          <div class="classes">
            <input
              class="classes"
              name="name"
              type="number"
              id="name"
              step="any"
              autocomplete="new-password"
              value="70"
            />
          </div>
          <div class="classes">
            HERE IS THE ERROR MESSAGE DISPLAYED
          </div>
        </div>
      </div>
      <div class="classes">
        <button class="classes" type="button" id="cancel">
          <p class="classes">Abbrechen</p></button
        ><button class="classes" type="submit" id="ok">
          <p class="classes">Ok</p>
        </button>
      </div>
    </form>
  </div>
</div>

Вот некоторый код селена:

Это функция для заполнения поля требуемым вводом:

public void fillField(String input) {
        driver.findElement(byId).click();
        driver.findElement(byId2).click();
        driver.findElement(byId2).clear();
        driver.findElement(byId2).clear();
        driver.findElement(byId2).sendKeys(input);
    }

нам нужно очистить поле здесь дважды, потому что по какой-то причине один раз не очищает его , Но на данный момент это не проблема.

Затем мы просто нажимаем кнопку ОК с:

public void clickOk() {
        driver.findElement(byOkModal).click();
    }

Но дело в том, что нажимается Ok и сообщение об ошибке не появляется. Появляется при нажатии вручную.

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

1 Ответ

0 голосов
/ 15 февраля 2020

Как уже упоминалось ранее, было бы очень полезно разместить здесь свой сценарий селена, но вы можете попробовать что-то вроде этого.

Редактировать: try-catch может помочь

    public boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

или свободное ожидание

    public void waitUntilWebElement(final WebElement element) {
        new FluentWait<>(driver)
                .withTimeout(Duration.ofSeconds(30))
                .pollingEvery(Duration.ofSeconds(3))
                .until(d -> {
                    if(element.isDisplayed()) {
                        // do something
                    } else {
                        // do something
                    }
                });
    }

Подробнее о свободном ожидании можно прочитать здесь: https://selenium.dev/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html

Надеюсь, это поможет.

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