Как лучше всего использовать ExpectedConditions.or с переменным количеством условий
Я работал с ExpectedConditions.or . Например, очень полезно найти, присутствует ли тот или иной элемент. Теперь я хотел бы создать более гибкий метод, используя переменные аргументы.
Посмотрите, что я сделал ниже. Это работает... как бы то ни было, но я бы хотел более элегантное решение, которое фактически работало бы с любым количеством элементов.
public void waitForSomeElementToBeVisible(int timeout, final By... locators) throws Exception, TimeoutException {
boolean found = false;
try {
waitUntilJSReady();
setImplicitWait(0);
WebDriverWait wait = new WebDriverWait(driver, timeout);
if (1 == locators.length) {
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(locators[0]));
found = null == element ? false : true;
} else if (2 == locators.length) {
found = wait.until(ExpectedConditions.or(ExpectedConditions.visibilityOfElementLocated(locators[0]),
ExpectedConditions.visibilityOfElementLocated(locators[1])));
} else if (3 == locators.length ) {
found = wait.until(ExpectedConditions.or(ExpectedConditions.visibilityOfElementLocated(locators[0]),
ExpectedConditions.visibilityOfElementLocated(locators[1]),
ExpectedConditions.visibilityOfElementLocated(locators[2])));
} else if (4 == locators.length ) {
found = wait.until(ExpectedConditions.or(ExpectedConditions.visibilityOfElementLocated(locators[0]),
ExpectedConditions.visibilityOfElementLocated(locators[1]),
ExpectedConditions.visibilityOfElementLocated(locators[2]),
ExpectedConditions.visibilityOfElementLocated(locators[3])));
}
} catch (Exception e) {
// log...whatever
throw e;
} finally {
setImplicitWait(SelTestCase.WAIT_TIME_OUT);
}
if (!found) throw new TimeoutException("Nothing found");
}
1 ответ
Решение
Вы можете получить количество локаторов во время выполнения и использовать их в for
петля.
В приведенном ниже коде я создал массив, который содержит ExpectedCondition[]
, Храните их, прежде чем использовать их в until
метод, а затем просто передать его until
Это позволяет избавиться от if-else
:)
public void waitForSomeElementToBeVisible(int timeout, final By... locators) throws Exception, TimeoutException {
boolean found = false;
try {
waitUntilJSReady();
setImplicitWait(0);
WebDriverWait wait = new WebDriverWait(driver, timeout);
ExpectedCondition<?>[] conditionsToEvaluate = new ExpectedCondition[locators.length];
for (int i = 0; i < locators.length; i++) {
conditionsToEvaluate[i] = ExpectedConditions.visibilityOfElementLocated(locators[i]);
}
found = wait.until(ExpectedConditions.or(conditionsToEvaluate));
} catch (Exception e) {
// log...whatever
throw e;
} finally {
setImplicitWait(SelTestCase.WAIT_TIME_OUT);
}
if (!found) throw new TimeoutException("Nothing found");
}
Надеюсь, это поможет!