1. 希望能對WebDriver的超時(HttpClient)自定義配置
關鍵的類: HttpCommandExecutor、HttpClientFactory
顧名思義,HttpClientFactory可以生成HttpClient用於處理HTTP請求,而從源碼中可以看到其中的SoTimeout並不合理
HttpClientFactory :
private final int TIMEOUT_THREE_HOURS = (int) SECONDS.toMillis( 60 * 60 * 3);
public HttpParams getHttpParams() {
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setSoReuseaddr(params, true);
HttpConnectionParams.setConnectionTimeout(params, 120 * 1000);
HttpConnectionParams.setSoTimeout(params, TIMEOUT_THREE_HOURS);
params.setIntParameter(ConnConnectionPNames.MAX_STATUS_LINE_GARBAGE, 0);
HttpConnectionParams.setStaleCheckingEnabled(params, true);
return params;
}
其默認的socket read超時居然是喪心病狂的三個小時
這也就導致我們在執行WebDriver的操作的時候時不時會有線程一直阻塞直到三小時後RemoteWebDriver拋出異常:
UnreachableBrowserException : Forwarding XXX(表示發送給WebDriver的命令) on session SessioinID to remote
這種情況可能發生在get()、findElement()等方法
優化思路 :
1. 使用適配器模式自定義自己的HttpClient生成方式
2. 照搬這些類的源碼並添加自己的自定義邏輯
2.希望可以自定義日誌文件的路徑
關鍵的類 : PhantomJSDriverService
其中的創建邏輯如下:
public static PhantomJSDriverService createDefaultService(Capabilities desiredCapabilities) {
// Look for Proxy configuration within the Capabilities
Proxy proxy = null;
if (desiredCapabilities != null) {
proxy = Proxies.extractProxy(desiredCapabilities);
}
// Find PhantomJS executable
File phantomjsfile = findPhantomJS(desiredCapabilities, PHANTOMJS_DOC_LINK, PHANTOMJS_DOWNLOAD_LINK);
// Find GhostDriver main JavaScript file
File ghostDriverfile = findGhostDriver(desiredCapabilities, GHOSTDRIVER_DOC_LINK, GHOSTDRIVER_DOWNLOAD_LINK);
// Build & return service
return new Builder().usingPhantomJSExecutable(phantomjsfile)
.usingGhostDriver(ghostDriverfile)
.usingAnyFreePort()
.withProxy(proxy)
.withLogFile(new File(PHANTOMJS_DEFAULT_LOGFILE))
.usingCommandLineArguments(
findCLIArgumentsFromCaps(desiredCapabilities, PHANTOMJS_CLI_ARGS))
.usingGhostDriverCommandLineArguments(
findCLIArgumentsFromCaps(desiredCapabilities, PHANTOMJS_GHOSTDRIVER_CLI_ARGS))
.build();
}
可見日誌路徑已經被withLogFile()硬編碼了,其自定義策略同上
或者對GhostDriver熟悉的可以直接通過GhostDriver來進行更深層的自定義
感想:希望selenium對於一些配置項能夠提供優雅地修改的方式