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

时间:2018-03-06 17:38:56

标签: java selenium geckodriver

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

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

所以我改用:

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

但是当我不是遥远的时候,那就是让我使用RemoteWebDriver。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

问题在于它仍然过于宽泛。有一些未知数:你是如何运行的? JUnit?,Maven?,Jenkins?而且我仍然不清楚这个 per-tenat geckoDriverBinaryPath来自何处以及它是如何传播的。

使用时有什么问题:

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

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

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

如果从命令行运行它,无论是直接运行还是使用Maven,您都可以像-DgeckoDriverBinaryPath=/some/path那样传递变量,然后在代码中使用以下命令读取它:

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

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

这个答案可能会因为没有答案而被关闭,而是更多的讨论。 :(