如何通过 Java 使用 Selenium 将功能和选项传递给 Firefoxdriver
Posted
技术标签:
【中文标题】如何通过 Java 使用 Selenium 将功能和选项传递给 Firefoxdriver【英文标题】:How to pass the capabilities and options into Firefoxdriver using Selenium through Java 【发布时间】:2019-12-21 00:34:34 【问题描述】:我有这个:
System.setProperty("webdriver.gecko.driver", "gecko/linux/geckodriver");
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.proxy.no_proxies_on", "localhost");
profile.setPreference("javascript.enabled", true);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
FirefoxOptions options = new FirefoxOptions();
options.setLogLevel(Level.FINEST);
options.addPreference("browser.link.open_newwindow", 3);
options.addPreference("browser.link.open_newwindow.restriction", 0);
现在我有两个不同的构造函数:
WebDriver driver = new FirefoxDriver(capabilities);
和
WebDriver driver = new FirefoxDriver(options);
如何将它们(功能和选项)都传递到driver
?顺便说一句,IDE 告诉我 FirefoxDriver(capabilities)
已弃用。
【问题讨论】:
【参考方案1】:你快到了。您需要使用 MutableCapabilities 类中的方法 merge()
将 DesiredCapabilities 类型的对象合并到 FirefoxOptions 类型的对象中并启动 WebDriver和 WebClient 实例通过传递 FirefoxOptions 对象如下:
System.setProperty("webdriver.gecko.driver", "gecko/linux/geckodriver");
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.proxy.no_proxies_on", "localhost");
profile.setPreference("javascript.enabled", true);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
FirefoxOptions options = new FirefoxOptions();
options.merge(capabilities);
options.setLogLevel(Level.FINEST);
options.addPreference("browser.link.open_newwindow", 3);
options.addPreference("browser.link.open_newwindow.restriction", 0);
WebDriver driver = new FirefoxDriver(options);
参考文献
您可以在以下位置找到一些相关讨论:
How to Merge Chrome driver service with desired capabilities for headless using xvfb? How to address “The constructor ChromeDriver(Capabilities) is deprecated” and WebDriverException: Timed out error with ChromeDriver and Chrome【讨论】:
它叫我java.lang.IllegalArgumentException: Preference browser.link.open_newwindow may not be overridden: frozen value=2, requested value=3
...我该怎么办?
@assembler 该错误与您作为 browser.link.open_newwindow.restriction
/ 0
传递的 Key / Value 对有关。但这个答案是为了满足您将功能和选项传递给 Firefoxdriver 的需要【参考方案2】:
您可以将功能传递给firefoxoptions constructor
,如下所示:
System.setProperty("webdriver.gecko.driver", "gecko/linux/geckodriver");
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.proxy.no_proxies_on", "localhost");
profile.setPreference("javascript.enabled", true);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
FirefoxOptions options = new FirefoxOptions(capabilities);
set profile to firefox options
options.setProfile(profile);
options.setLogLevel(Level.FINEST);
options.addPreference("browser.link.open_newwindow", 3);
options.addPreference("browser.link.open_newwindow.restriction", 0);
pass firefox options as parameter to create driver
WebDriver driver = new FirefoxDriver(options);
【讨论】:
以上是关于如何通过 Java 使用 Selenium 将功能和选项传递给 Firefoxdriver的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Selenium 和 Java 通过 PageFactory 等待元素不可见
如何使用 Selenium WebDriver、Java 通过文本选择 Web 元素
如何通过 Java 使用 XPath 和 Selenium WebDriver 单击 SVG 元素