Реализация глобального прослушивателя для приостановки выполнения кода

#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 . Не видя вашего кода, я не совсем уверен, как вы это реализуете, но вот ресурс с несколькими хорошими примерами.

http://toolsqa.com/selenium-webdriver/event-listener/