如何将Selenium Webdriver连接到现有的Firefox/Chrome浏览器会话?

12

这可能是一个重复的问题,但我找不到任何解决方案。最近我发现了一个相关的帖子Connecting Selenium WebDriver to an existing browser session但人们建议我提出一个新的问题。

如果有人尝试将selenium webdriver连接到先前由selenium本身产生的现有浏览器会话,并成功实现,请让我知道。

我找到了一些关于firefox和selenium 2.X版本尝试的建议。但这些建议对于selenium 3.X不起作用,并且没有chrome浏览器的解决方案。

我已经尝试了所有针对Selenium 25.3,Firefox v46的建议,并且它可以工作。但是对于Chrome和Chrome Driver,我无法使其工作。

编辑:

这是我尝试过的代码:

开始Firefox驱动程序

System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir")+"/StartFirefoxSession_lib/geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");

复制了RemoteWebDriver源代码并将capabilities从private更改为protected。

protected Capabilities capabilities; 

创建了一个名为RemoteDriverEx的新类,扩展了复制的RemoteWebDriver类。将原始驱动程序发出的NEW_SESSION命令更改为GET_CURRENT_URL。

Response response = execute(DriverCommand.GET_CURRENT_URL, Collections.EMPTY_MAP);

然后创建了一个JUnit测试来验证

但我被异常困扰了

org.openqa.selenium.WebDriverException: No command or response codec has been defined. Unable to proceed
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'WPANDBW7HYD', ip: '192.168.56.1', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_74'
Driver info: driver.version: RemoteWebDriver
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:154)

完整代码已在https://drive.google.com/open?id=0Bz2XxuQQc24KdHVqR3BPaXowUnM分享。


据我所知,Selenium不支持这个。 - mosaad
https://stackoverflow.com/questions/42066902/running-a-test-case-on-a-webpage-that-is-already-open/42067778#42067778 - mosaad
@mosaad 谢谢分享链接。你有注意到备注吗?“使用IE,可以迭代操作系统中打开的窗口,并找到正确的IE进程进行附加”。我想知道是否有相关帖子讨论这个问题。 - undetected Selenium
问题中没有提到IE浏览器。也许更新一下问题,这样才能找到正确的人。 - mosaad
我发现这是一个长期存在的请求。人们已经尝试过许多技术来解决这个问题。这里有一个使用Python的建议 https://dev59.com/hJjga4cB1Zd3GeqPHkFz#37968826 并尝试在Java中实现和检查相同的方法。 - Panda Biswajit
显示剩余6条评论
2个回答

5
在Selenium中,只要有想要连接的会话的调试器地址,就可以实现连接。如果你不知道什么是调试器地址,它其实就是你的会话在本地主机上运行的地址,看起来像是localhost:60003。现在每个情况下都会有所不同。以下是使用c#代码的步骤。
  1. 获取浏览器的调试器地址,以便稍后使用调试模式连接,如下图所示。在浏览器启动后获取值。

enter image description here

  1. 现在让浏览器保持运行状态,并使用以下代码重新连接同一浏览器。

ChromeOptions option = new ChromeOptions();

option.DebuggerAddress="localhost:60422";//我们需要添加这个chrome option来连接所需的会话

driver = new ChromeDriver(option);

driver.Navigate().GoToUrl("https://www.google.com/");

希望这可以帮助!如果需要任何澄清,请在评论中告诉我。


你能否详细解释一下如何找到调试器地址?那是截图的什么内容? - holastello
1
@holastello 我在调试模式下拍了这张截图。一种方法是打开调试模式,在驱动程序上设置断点,然后可以获取启动会话的调试器地址。另一种方法是使用“--remote-debugging-port=60422”在您希望的端口号上启动Chrome(您可以使用自己想要的端口号),并使用该端口地址连接到已启动的Chrome。希望能有所帮助。 - Krunal Patel

3

我找到了一种用于Firefox的本地hack方式解决问题的方法:

首先,您需要使用以下参数启动一个单独的浏览器实例(手动启动):

firefox.exe --marionette -profile C:\FirefoxTEMP

上面我们打开了一个Firefox实例,并启用了--marionette,并选择了一个专门为Selenium任务创建的固定配置文件夹。

现在,我们将通过添加参数来选择与之前启动的相同配置文件,将自动化附加到已经打开的Firefox窗口。

注意:您必须选择相同的配置文件夹,以便Webdriver使用打开的实例。

FirefoxOptions options = new FirefoxOptions();
options.AddArguments("--profile C:\\FirefoxTEMP");


driver = new FirefoxDriver(options);

driver.Navigate().GoToUrl("https://google.com");

同样适用于Linux! - Saqster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接