将Selenium WebDriver连接到现有的浏览器会话

我正在使用selenium,如果现有浏览器会话(对我来说Chrome)当前存在,我想附加一个webdriver实例。 我不想打开新的浏览器窗口/会话。 我用google搜索并看到,有一些方法可以使用这些网站上的描述:

  1. 通过扩展RemoteWebDriver重用现有的浏览器会话
  2. ChromeDriverService的基本资料

我在最新版本中使用ChromeDriver 2.29 。

我的代码现在看起来如下:

public static void main(String[] args) throws Exception { // starting Chrome Webdriver server ChromeDriverService service = new ChromeDriverService.Builder() .usingDriverExecutable(new File("D:\\Development\\chromedriver\\chromedriver.exe")) .usingAnyFreePort() .build(); service.start(); WebDriver driver = new CustomRemoteWebDriver(service.getUrl(),DesiredCapabilities.chrome()); driver.get("http://www.google.com"); WebDriver driver2 = new CustomRemoteWebDriver(service.getUrl(),DesiredCapabilities.chrome()); // here I am expecting www.google.com from last driver instance, because it should have the same session System.out.println(driver2.getCurrentUrl()); driver.quit(); driver2.quit(); } 

扩展的RemoteWebDriver,用于检查会话是否已存在:

 public class CustomRemoteWebDriver extends RemoteWebDriver { public static String sessiondIdPath = "c:\\automation\\sessionid"; public CustomRemoteWebDriver(URL remoteAddress, Capabilities desiredCapabilities) { super(remoteAddress, desiredCapabilities); } @Override protected void startSession(Capabilities desiredCapabilities) { String sid = getPreviousSessionIdFromSomeStorage(); if (sid != null) { setSessionId(sid); try { getCurrentUrl(); } catch (WebDriverException e) { // session is not valid e.printStackTrace(); sid = null; } } if (sid == null) { super.startSession(desiredCapabilities); saveSessionIdToSomeStorage(getSessionId().toString()); } } private void saveSessionIdToSomeStorage(String sessionId) { try { FileUtils.writeStringToFile(new File(sessiondIdPath), sessionId, Charset.defaultCharset()); } catch (IOException e) { e.printStackTrace(); } } private String getPreviousSessionIdFromSomeStorage() { String sessionId; try { List sidText = FileUtils.readLines(new File(sessiondIdPath), Charset.defaultCharset()); sessionId = sidText.get(0); } catch (Exception e) { return null; } return sessionId; } } 

和pom.xml:

   4.0.0 org.andy.selenium remotewebdriverexample 1.0-SNAPSHOT    org.seleniumhq.selenium selenium-java 3.4.0    org.apache.commons commons-lang3 3.5    io.appium java-client 4.1.2       org.apache.maven.plugins maven-compiler-plugin 3.6.1  1.8 1.8       

假设我当前没有保存sessionId:启动driver1并转到www.google.com按预期工作。 在初始化driver2 ,在CustomRemoteWebDriver#startSession #startSession中抛出WebDriverException。 所以它打印堆栈跟踪,sessionId似乎无效。 stacktrace的输出如下:

在端口31495上启动ChromeDriver 2.29.461591(62ebf098771772160f391d75e589dc567915b233)仅允许本地连接。 Mai 25,2017 6:53:14 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFORMATION:Detected dialect:OSS

org.openqa.selenium.WebDriverException:未定义任何命令或响应编解码器。 无法继续构建信息:版本:’3.4.0’,修订版:’未知’,时间:’未知’系统信息:主机:’DESKTOP-AGEFV4C’,ip:’192.168.134.1’,os.name:’Windows 10’,os.arch:’amd64’,os.version:’10 .0’,java.version:’1.8.0_121’驱动程序信息:driver.version:CustomRemoteWebDriver at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor .java:154)org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:694)org.openqa.selenium。位于org.openqa.selenium.remote的org.openqa.selenium.remote.RemoteWebDriver。(RemoteWebDriver.java:137)的CustomRemoteWebDriver.startSession(CustomRemoteWebDriver.java:57)上的remote.RemoteWebDriver.getCurrentUrl(RemoteWebDriver.java:374)。 RemoteWebDriver。(RemoteWebDriver.java:174)位于RemoteBrowserConnector.main的RemoteBrowserConnector.start(RemoteBrowserConnector.java:40)上的CustomRemoteWebDriver。(CustomRemoteWebDriver.java:22)(RemoteBrowserConn) ector.java:26)Mai 25,2017 6:53:18 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFORMATION:Detected dialect:OSS

我已经通过更新这个post建议的java客户端来尝试它,但它没有帮助。 由于此exception,始终会打开一个新窗口。 任何想法,我做错了什么?