实现全局侦听器以暂停代码执行

Implement global listener to pause code execution

我有这个用于暂停执行 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 定位器检测)

有一个WebDriverEventListener可以完成你想要的。您可以实现此侦听器,以便在 selenium 执行每个命令之前,侦听器检查 visibilityOfElementLocated(By.xpath("//div[@class='ngx-loading-text center-center' and starts-with(., 'Loading')]")));,如果是,则执行您的 WebDriverWait。在没有看到您的代码的情况下,我不确定您将如何实现它,但这里有一个包含一些很好示例的资源。

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

一个比使用侦听器复杂一点的解决方案是用代理包装您的元素,并在您访问代理时执行检查。

让监听器监听事件而不改变测试流程,

首先,我们需要创建一个 class,它将在您调用元素时执行检查:

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),这将 return 一个新的代理元素,类似于 PageFactory 的行为。 最后一件事是将其包装在您自己的 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);
            }  
        }

    }
    
}

现在,如果您在有加载栏的网页中,请使用新的 MyPageFactory,它将自动执行检查。

如果您不需要执行检查,请使用常规 PageFactory

参考:https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-popup-alerts/