Selenium: как ждать выбора вариантов для выбора? - PullRequest
17 голосов
/ 04 июля 2011

Я впервые использую Selenium, и у меня нет выбора.Я использую IDE в Firefox.

Когда моя страница загружается, она впоследствии извлекает значения через запрос JSONP, с помощью которого она заполняет параметры в выборке.

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

Ответы [ 8 ]

13 голосов
/ 17 января 2014

Я использовал waitForElementPresent с целью css .

Пример: ждать, пока

<select id="myselect"></select>

будет заполнено

<option value="123">One-two-three</option>

использовать

  • Команда: waitForElementPresent
  • Цель: css=#myselect option[value=123]
  • Значение: (оставить пустым)
2 голосов
/ 06 июня 2017

Мне показалось что-то вроде:

wait.until(
    ExpectedConditions
        .presenceOfNestedElementsLocatedBy(By.id(<selectioNId>), By.tagName("option"))
)
2 голосов
/ 14 ноября 2013

Вы можете использовать команду «WaitForSelectOption», где ваше значение может быть прямой меткой лайк ярлык = 1-я учетная запись цель будет иметь идентификатор объекта

1 голос
/ 14 декабря 2017

Использование Java 8 Awaitility

Awaitility.await()
.atMost(5, TimeUnit.SECONDS)
.until(() -> select.getOptions().size() > 0);
1 голос
/ 28 октября 2015

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

Select select = new Select(driver.findElement(cssSelector("cssSelectorOfSelectBox")));    
waitUnitlSelectOptionsPopulated(select)

Здесь приведено определение waitUnitlSelectOptionsPopulated

private void waitUntilSelectOptionsPopulated(final Select select) {
            new FluentWait<WebDriver>(driver)
                    .withTimeout(60, TimeUnit.SECONDS)
                    .pollingEvery(10, TimeUnit.MILLISECONDS)
                    .until(new Predicate<WebDriver>() {
                        public boolean apply(WebDriver d) {
                            return (select.getOptions().size() > 1);
                        }
                    });
        }

Примечание. В нашем случае требовалась проверка select.getOptions (). Size ()> 1, поскольку у нас всегда отображался один статический параметр.

1 голос
/ 07 августа 2015

Я сделал следующую функцию в C #, которая возвращает выбор при заполнении.

Вы должны пройти By, чтобы найти элемент, и вы определенное время, чтобы ждать его заполнения:

public static SelectElement FindSelectElementWhenPopulated(this IWebDriver driver, By by, int delayInSeconds)
    {
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(delayInSeconds));
        return wait.Until<SelectElement>(drv => 
        {
            SelectElement element = new SelectElement(drv.FindElement(by));
            if (element.Options.Count >= 2)
            {
                return element;
            }

            return null;
        }
        );
    }

В моем случае я проверяю, что выбор имеет более 2Вы можете изменить код так, чтобы он соответствовал количеству, которое соответствует вашим потребностям.

1 голос
/ 23 октября 2013

Я думаю, что вы должны использовать

waitForElementPresent команда. Если возможно, давайте посмотрим на ваш IDE-код селена.

0 голосов
/ 24 марта 2017

Его работа для меня:

  WebElement element = driver.findElement(By.xpath("//select[@name='NamE']/option[1]"));
  return element.getAttribute("text");
...