当您无法通过系统 属性 或路径指定 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);
在我的应用程序中,我无法使用 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);