【问题标题】:How can I pass Selenium WebDriver objects between seperate Ruby processes?如何在单独的 Ruby 进程之间传递 Selenium WebDriver 对象?
【发布时间】:2026-01-19 23:35:01
【问题描述】:

我想在两个 Ruby 进程之间传递一个对象的实例。具体来说,我想将 Selenium WebDriver 的实例从一个进程传递到另一个进程。我想这样做的原因是因为 Ruby 需要很长时间才能创建这个对象,但我希望它被其他进程使用。

我发现一些相关问题herehere 似乎指向使用 DRb,但我一直找不到任何有用的示例或示例代码。

我应该使用除 DRb 之外的其他工具吗?有人有类似的例子可以复制吗?

【问题讨论】:

  • 我在调查时确实遇到了赛璐珞,但我不认为它可以分布在多个服务器上。感谢您的链接!
  • 我只知道c#,但由于驱动程序是一个对象,你能把它保存为Binary Serialization吗?或者make the object global?不过有趣的想法。加载浏览器非常快,但是在我真正开始测试之前的登录和导航会使事情变得有点慢。如果能够已经有一个活跃的会话,那就太好了。
  • 我已将您的建议添加到我的回答中。感谢您的意见。

标签: ruby serialization selenium-webdriver ipc marshalling


【解决方案1】:

看起来您将不得不使用 DRb,尽管似乎缺少它的文档。然而有一篇有趣的文章here。您可能还想考虑购买 Masatoshi Seki 的 The dRuby Book,以更好地了解如何有效地做到这一点。

如果您不考虑同时访问,而只是想将对象从一个进程发送到另一个进程,另一种调查方法是使用 YAML 序列化(即以 Ruby 可以读取的方式编码)对象(对于人类可读文件)或 Marshall(对于二进制编码文件)并使用管道发送。这在另一个已被删除的答案中有所提及。

请注意,这些解决方案中的任何一个都需要大量修改 Selenium 代码,因为您要操作的对象既不支持复制,也不支持本地同时访问。

【讨论】:

    【解决方案2】:

    TL;DR

    大多数队列或分布式进程都需要某种序列化才能正常工作。如果您想传递对象而不是消息,那么这将成为您解决问题的一个限制因素。

    DRb

    我不知道你是否可以marshal 一个 WebDriver 对象。如果您不能,那么 DRb 可能是您的分布式 Ruby 程序的一个不错的选择,因为它支持 DRbObject 对无法编组的事物的引用。 DRb documentation中提供了一些示例。

    硒线协议

    根据您真正想要做的事情,可能值得仔细研究一下使用remote bindings 用于Remote WebDriver 客户端/服务器,或Selenium 的JSON Wire Protocol 作为在进程之间传递对象的替代方案.

    其他替代品:夹具、工厂、存根和模拟

    这些在您的特定情况下是否有效很大程度上取决于您为什么要传递对象而不是简单地驱动远程服务器。如果主要是构建对象需要多长时间的问题,那么序列化/反序列化周期可能不一定在所有情况下都更快。

    您可能想重新访问为什么您的对象创建速度如此之慢。如果为它收集和处理数据花费的时间太长,您可以使用某种测试夹具或工厂来调整该时间,或者使用较小的固定数据集,或者使用针对速度进行优化的预序列化对象.

    您还可以考虑是否真的需要真实数据或对象来进行测试。在许多情况下,您可以通过存根方法或创建模拟对象来大大加快测试速度,这些对象将返回集成测试所需的值,而无需执行昂贵的计算或长时间运行的操作。

    在某些情况下,您需要驱动整个堆栈并对真实数据执行验收测试。即使这样,您也可以设计一组夹具数据,这些数据将花费更少的时间或内存来处理。这当然值得至少考虑一下。

    【讨论】: