前言
在使用远程SeleniumHub创建的RemoteWebDriver
时,是无法使用使用getLocalStorage()
或getSessionStorage()
方法获取到Storage对象的:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setHeadless(true);
chromeOptions.addArguments("--no-sandbox");
WebDriver webDriver = new RemoteWebDriver("http://remoteHost:4444/wd/hub", chromeOptions);
WebStorage webStorage = (WebStorage)webDriver; // 这里会发生类型转换异常
LocalStorage localStorage = webStorage.getLocalStorage();
SessionStrage sessionStorage = webStorage.getSessionStorage();
原因
由于RemoteWebDriver
没有实现WebStorage
接口,所以自然不能转换类型,WebStorage
接口定义:
public interface WebStorage {
LocalStorage getLocalStorage();
SessionStorage getSessionStorage();
}
解决方法
自定义一个RemoteWebDriver
的子类,并实现WebStorage
接口:
public class RemoteStorageWebDriver extends RemoteWebDriver implements WebStorage {
private RemoteWebStorage webStorage;
public RemoteStorageWebDriver(URL remoteAddress, Capabilities capabilities) {
super(remoteAddress, capabilities);
webStorage = new RemoteWebStorage(getExecuteMethod());
}
@Override
public LocalStorage getLocalStorage() {
return webStorage.getLocalStorage();
}
@Override
public SessionStorage getSessionStorage() {
return webStorage.getSessionStorage();
}
}
WebDriver webDriver = new RemoteStorageWebDriver("http://remoteHost:4444/wd/hub", chromeOptions);
WebStorage webStorage = (WebStorage)webDriver; // 正常转换
LocalStorage localStorage = webStorage.getLocalStorage();
SessionStrage sessionStorage = webStorage.getSessionStorage();