一种比使用监听器复杂一点的解决方案是使用代理包装您的元素,并在您点击代理时执行检查。
让监听器监听事件而不改变测试的流程,
首先,我们需要创建一个类,它会在您调用元素时执行检查:
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 在幕后的行为。
最后一件事是将它包裹在你自己的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/