在我的应用程序中,我无法使用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。
有更好的方法吗?
答案 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);
...
如果不同的租户修复了路径,您可以编写一个实用程序函数来检测正在运行的租户,并相应地设置该属性。
这个答案可能会因为没有答案而被关闭,而是更多的讨论。 :(