Selenium自定義配置的策略

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對於一些配置項能夠提供優雅地修改的方式







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章