我需要创建一个监控selenium执行的进程,如果在执行期间到达,则会点击弹出窗口。
假设我的selenium自动化脚本当前正在执行,突然出现了一些弹出窗口,我需要处理弹出窗口。我该怎么办?
在我的项目中,我们所有的脚本都已准备就绪,因此无法修改这些脚本。所以我需要创建单独的线程来监视Selenium脚本执行并处理弹出窗口。
请建议在这方面可以做些什么。
答案 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;
}
}