#selenium #selenium-webdriver #junit #selenium-chromedriver #junit5
#selenium #selenium-webdriver #junit #selenium-chromedriver #junit5
Вопрос:
У меня есть этот код, который используется для приостановки выполнения кода Selenium:
Boolean waitruntil = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='ngx-loading-text center-center' and starts-with(., 'Loading')]")));
У меня каждый тест выполняется в коде JUnit. Знаете ли вы, как я могу реализовать глобальный прослушиватель, который приостанавливает выполнение кода, если отображается панель загрузки (определяется с помощью Xpath locator)
Ответ №1:
Одним из решений, которое немного сложнее, чем использование прослушивателя, было бы обернуть ваш элемент прокси-сервером и выполнять проверку всякий раз, когда вы нажимаете на прокси.
Пусть слушатели прослушивают события и не меняют поток теста,
Прежде всего, нам нужно создать класс, который будет выполнять проверку при каждом вызове элемента:
public class ElementProxy implements InvocationHandler {
private final WebElement element;
public ElementProxy(WebElement element) {
this.element = element;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.waitForPageLoad();
return method.invoke(element, args);
}
private void waitForPageLoad() {
WebDriver driver = ((WrapsDriver) element).getWrappedDriver();
WebElement loadingBar = driver.findElement(By.xpath("//div[@class='ngx-loading-text center-center' and starts-with(., 'Loading')]"));
new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElement(loadingBar))
}
public static WebElement proxy(WebElement element) {
ElementProxy proxy = new ElementProxy(element);
WebElement wrappdElement = (WebElement) Proxy.newProxyInstance(ElementProxy.class.getClassLoader(),
new Class[] { WebElement.class },
proxy);
return wrappdElement;
}
}
Затем вы можете вызвать ElementProxy.proxy(element)
, который вернет новый прокси-элемент, аналогичный поведению PageFactory
under the hood .
Последнее, что нужно сделать, это обернуть его под свой собственный PageFactory
, чтобы вы могли контролировать поведение элементов:
public class MyPageFactory {
public static <T> void initElements(WebDriver driver, T pageObject) {
PageFactory.initElements(driver, pageObject);
for (Field field : pageObject.getClass().getDeclaredFields()) {
if (field.getType().equals(WebElement.class)) {
boolean accessible = field.isAccessible();
field.setAccessible(true);
field.set(pageobject, ElementProxy.proxy((WebElement) field.get(pageObject)));
field.setAccessible(accessible);
}
}
}
}
Теперь, если вы находитесь на веб-странице, где присутствует панель загрузки, используйте свой new MyPageFactory
, который выполнит проверку автоматически.
Если вам не нужно выполнять проверку, используйте обычный PageFactory
.
Ссылка: https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-popup-alerts /
Комментарии:
1. У меня есть еще один вопрос. У меня есть ряд кнопок для нажатия. В таком случае, как я могу использовать этот код?
Ответ №2:
Существует WebDriverEventListener
, который может выполнить то, что вы хотите. Вы могли бы реализовать этот прослушиватель таким образом, чтобы перед каждой командой, выполняемой selenium, прослушиватель проверял visibilityOfElementLocated(By.xpath("//div[@class='ngx-loading-text center-center' and starts-with(., 'Loading')]")));
, и если это так, выполняйте ваш WebDriverWait . Не видя вашего кода, я не совсем уверен, как вы это реализуете, но вот ресурс с несколькими хорошими примерами.