Ответ 1
Я думаю, вам следует использовать
waitForElementPresent
. Если возможно, позвольте мне увидеть ваш код IDE селена.
Я использую Selenium в первый раз и перегружен вариантами. Я использую IDE в Firefox.
Когда моя страница загружается, она впоследствии извлекает значения через запрос JSONP, с помощью которого он заполняет параметры в элементе выбора.
Как мне заставить Selenium ждать, пока какой-либо вариант в предложении будет присутствовать, прежде чем продолжить?
Я думаю, вам следует использовать
waitForElementPresent
. Если возможно, позвольте мне увидеть ваш код IDE селена.
Я использовал waitForElementPresent
с целевой css.
Пример: ждать
<select id="myselect"></select>
для заполнения
<option value="123">One-two-three</option>
использование
waitForElementPresent
css=#myselect option[value=123]
Вы можете использовать команду "WaitForSelectOption", где ваше значение может быть прямой меткой как label = 1-save account target будет иметь идентификатор объекта
У нас была аналогичная проблема, когда параметры в раскрывающемся списке были получены из сторонней службы, что иногда было более медленной.
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 была необходима в нашем случае, поскольку мы всегда показывали один статический параметр.
Я сделал следующую функцию в С#, которая возвращает выбор при заполнении.
Вам нужно передать 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;
}
);
}
В моем случае я проверяю, что выбор имеет более двух параметров, вы можете изменить код, чтобы он проверял количество, соответствующее вашим потребностям.
Его работа для меня:
WebElement element = driver.findElement(By.xpath("//select[@name='NamE']/option[1]"));
return element.getAttribute("text");
Мне понравилось что-то вроде:
wait.until(
ExpectedConditions
.presenceOfNestedElementsLocatedBy(By.id(<selectioNId>), By.tagName("option"))
)
Использование java 8 Awaitility
Awaitility.await()
.atMost(5, TimeUnit.SECONDS)
.until(() -> select.getOptions().size() > 0);