我需要创建一个监视selenium执行的进程,如果在执行期间到达,将单击弹出窗口

时间:2018-05-23 09:59:24

标签: java selenium selenium-webdriver webdriver

我需要创建一个监控selenium执行的进程,如果在执行期间到达,则会点击弹出窗口。

假设我的selenium自动化脚本当前正在执行,突然出现了一些弹出窗口,我需要处理弹出窗口。我该怎么办?

在我的项目中,我们所有的脚本都已准备就绪,因此无法修改这些脚本。所以我需要创建单独的线程来监视Selenium脚本执行并处理弹出窗口。

请建议在这方面可以做些什么。

1 个答案:

答案 0 :(得分:0)

Java支持创建动态代理类和实例。代理对象在许多情况下都很有用。

实现此接口的ElementProxy类。基本上,在调用实际方法之前,将首先调用代理的invoke方法。我们的想法是在调用WebElement上的任何操作之前调用checkForPopupAndKill,这可能是包含checkForPopupAndKill方法的正确位置。

公共类ElementProxy实现了InvocationHandler {

private final WebElement element;

public ElementProxy(WebElement element) {
    this.element = element;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //before invoking actual method check for the popup
    this.checkForPopupAndKill();
    //at this point, popup would have been closed if it had appeared. element action can be called safely now.
    Object result = method.invoke(element, args);
    return result;
}

private void checkForPopupAndKill() {
    if (popup.isDisplayed()) {
        System.out.println("You damn popup, you appearded again!!?? I am gonna kill you now!!");
        popup.close();
    }
}

}

需要使用此代理对象包装常规WebElement。我们基本上需要一个具有接受WebElement的方法的类,并使用一些包装器返回WebElement。

公共类ElementGuard {

public static WebElement guard(WebElement element) {
    ElementProxy proxy = new ElementProxy(element);
    WebElement wrappdElement = (WebElement) Proxy.newProxyInstance(ElementProxy.class.getClassLoader(),
                                                                   new Class[] { WebElement.class },
                                                                   proxy);
    return wrappdElement;
}

}