当您无法通过系统 属性 或路径指定 geckodriver 位置时,是否有非远程方法来指定它?

Is there a non-remote way to specify geckodriver location when you cannot specify it by System property or Path?

在我的应用程序中,我无法使用 System.setProperty 设置 geckodriver 可执行位置,我也无法在路径中设置它。

为什么?因为我的应用程序是多租户的...并且每个租户都有自己的目录,Firefox 和 Geckodriver 被复制并 运行。这是由于 Firefox + Geckodriver 中的错误,无限 javascript 循环和其他几种情况导致 Firefox 挂起,直到手动终止。有时 quit 也不能​​完全杀死东西。因此,我们需要在 JVM per-tenant 中提供自定义 geckodriver 位置。因此问题。

所以我改用:

driverService = new GeckoDriverService.Builder()
          .usingDriverExecutable(new File(geckoDriverBinaryPath))
          .build();
driverService.start();
RemoteWebDriver driver = new RemoteWebDriver(driverServiceUrl, capabilities);

但这让我在不在远程时使用 RemoteWebDriver。

有更好的方法吗?

就目前的问题而言,它仍然过于宽泛。有一些未知数:您 运行 对此感觉如何? JUnit?,Maven?,詹金斯?我仍然不清楚这个 per-tenat geckoDriverBinaryPath 是从哪里来的以及它是如何传递的。

仅仅使用有什么问题:

System.setProperty("webdriver.gecko.driver", geckoDriverBinaryPath);

您可以在 OS 中设置一个环境变量。像 export geckoDriverBinary=/some/path 这样的东西,然后在你的代码中使用:

读回它
String geckoDriverBinaryPath = System.getenv("geckoDriverBinary");
System.setProperty("webdriver.gecko.driver", geckoDriverBinaryPath);
...

如果您从命令行 运行ning 它,直接或使用 Maven,您可以像 -DgeckoDriverBinaryPath=/some/path 一样传递变量,然后在您的代码中使用以下命令读回它:

String geckoDriverBinaryPath = System.getProperty("geckoDriverBinary");
System.setProperty("webdriver.gecko.driver", geckoDriverBinaryPath);
...

如果不同的租户有固定的路径,您可以编写一个实用程序函数来检测它正在 运行 哪个租户,并相应地设置 属性。

这个答案可能会以 not-answer 的形式结束,但更多的是讨论。 :(

而不是在 FirefoxDriverService 对象上调用 start(),为什么不简单地使用接受服务的 FirefoxDriver 构造函数?

driverService = new GeckoDriverService.Builder()
      .usingDriverExecutable(new File(geckoDriverBinaryPath))
      .build();
WebDriver driver = new FirefoxDriver(driverService);