1. 希望能对WebDriver的超时(HttpClient)自定义配置
关键的类:
HttpCommandExecutor、HttpClientFactory
顾名思义,HttpClientFactory可以生成HttpClient用于处理HTTP请求,而从源码中可以看到其中的SoTimeout并不合理
其默认的socket read超时居然是丧心病狂的三个小时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; }
这也就导致我们在执行WebDriver的操作的时候时不时会有线程一直阻塞直到三小时后RemoteWebDriver抛出异常:
UnreachableBrowserException : Forwarding XXX(表示发送给WebDriver的命令) on session SessioinID to remote这种情况可能发生在get()、findElement()等方法
优化思路 :
1. 使用适配器模式自定义自己的HttpClient生成方式
2. 照搬这些类的源码并添加自己的自定义逻辑
2.希望可以自定义日志文件的路径
关键的类 : PhantomJSDriverService
其中的创建逻辑如下:
可见日志路径已经被withLogFile()硬编码了,其自定义策略同上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(); }
或者对GhostDriver熟悉的可以直接通过GhostDriver来进行更深层的自定义
感想:希望selenium对于一些配置项能够提供优雅地修改的方式