java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Возможности) при попытке объединить DesiredCapabilities с использованием Selenium
Когда я пытаюсь запустить новый Selenium/Firefox
экземпляр с DesiredCapabilities
а также FirfoxOptions
Получаю такой код:
Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions;
Я использую следующий код:
public WebDriver getDriver() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, InterruptedException
{
System.setProperty("webdriver.gecko.driver", GlobalVar.geckdriverExecutableFilePath);
//DesiredCapabilities capabilities = new DesiredCapabilities();
DesiredCapabilities dc = DesiredCapabilities.firefox();
if (proxyPOJO != null) {
Proxy proxy = new Proxy();
proxy.setHttpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
proxy.setFtpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
proxy.setSslProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
dc.setCapability(CapabilityType.PROXY, proxy);
}
FirefoxOptions opt = new FirefoxOptions();
opt.merge(dc);
opt.addPreference("dom.popup_maximum", 200);
opt.addPreference("dom.webnotifications.enabled", false);
opt.merge(capabilities);
WebDriver driver = WebDriverX.getNewFireFoxWebDriver(opt); // Basically calls: driver = new FirefoxDriver(firefoxOptions);
return driver;
}
Мой POM
файл содержит следующие записи:
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.11.0</version>
</dependency>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>26.0-jre</version>
</dependency>
Раньше у меня была версия 3.5.2 из org.seleniumhq.selenium
в POM, который не поддерживает merge
функциональность. Однако, когда я попытался запустить Selenium с версией3.5.2
используя следующий код:
System.setProperty("webdriver.gecko.driver", GlobalVar.geckdriverExecutableFilePath);
DesiredCapabilities capabilities = new DesiredCapabilities();
if (proxyPOJO != null) {
Proxy proxy = new Proxy();
proxy.setHttpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
proxy.setFtpProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
proxy.setSslProxy(proxyPOJO.getProxyIP() + ":" + proxyPOJO.getProxyPort());
capabilities.setCapability(CapabilityType.PROXY, proxy);
}
FirefoxOptions firefoxOptions = new FirefoxOptions(capabilities);
WebDriver driver = WebDriverX.getNewFireFoxWebDriver(firefoxOptions);
У меня следующее исключение:
NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.<init>(Lorg/openqa/selenium/Capabilities;)V
У меня последняя версия geckodriver.exe
установлен.
Ни версия 3.11.0, ни версия 3.5.2 не работают (пробовал также 3.8.2).
Что я делаю неправильно?
Спасибо!
ОБНОВИТЬ:
В версии 3.11.0 я получаю следующую трассировку стека:
Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions;
at webdriverX.WebDriverProfile.getTMPFirefoxProfile(WebDriverProfile.java:259)
at s.SPage.scrapeS(SPage.java:36)
at n.NMain.main(NMain.java:27)
В версии 3.5.2 следующая трассировка стека:
Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.<init>(Lorg/openqa/selenium/Capabilities;)V
at webdriverX.WebDriverProfile.getTMPFirefoxProfile(WebDriverProfile.java:232)
at s.SPage.scrapeS(SPage.java:36)
at n.NMain.main(NMain.java:27)
Метод getTMPFirefoxProfile()
в основном делает следующее:
if (firefoxOptions != null) {
driver = new FirefoxDriver(firefoxOptions);
} else {
driver = new FirefoxDriver();
}
Спасибо!!
1 ответ
Это сообщение об ошибке...
Exception in thread "main" java.lang.NoSuchMethodError: org.openqa.selenium.firefox.FirefoxOptions.merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions;
... подразумевает, что не было такого метода, определенного какmerge()
в добавленных вами классах.
слияние ()
merge()
определяется в MutableCapabilities как:
public MutableCapabilities merge(Capabilities extraCapabilities)
Merge the extra capabilities provided into this DesiredCapabilities instance. If capabilities with the same name exist in this instance, they will be overridden by the values from the extraCapabilities object.
Specified by:
merge in interface Capabilities
Parameters:
extraCapabilities - Additional capabilities to be added.
Returns:
The DesiredCapabilities instance after the merge.
MutableCapabilities
MutableCapabilities был добавлен в Selenium v3.7.0:
v3.7.0
======
* Migrated from using `DesiredCapabilities` to either
`MutableCapabilities` or (preferably) `ImmutableCapabilities`.
Зависимость от Maven
Кроме того, вам необходимо убедиться, что вы добавили один <dependency>
для Selenium следующим образом:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
Примечание:<dependency>
для selenium-java неявно также включает <dependency>
для гуавы.
Образец кода
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);
Дополнительные рекомендации
Гарантировать, что:
- JDK обновлен до текущего уровня JDK 8u232.
- Selenium обновлен до текущего уровня. Версия 3.141.59.
- Обновите GeckoDriver до уровня GeckoDriver v0.26.0.
- Обновление Firefox версии до v72.0 Firefox уровней.
- Если ваша базовая версия веб-клиента слишком старая, удалите ее с помощью Revo Uninstaller и установите последнюю версию GA и выпущенную версию веб-клиента.
- Выполните перезагрузку системы.
- Выполнить
mvn clean
,mvn build
а такжеmvn test
- Выполните свой
Test
как пользователь без полномочий root.
Примечание. В случае транзитивной зависимости вам, возможно, придется удалить
MAVEN_HOME
т.е.~\.m2
подкаталог.
Ссылка
Вы можете найти пару соответствующих обсуждений в:
- Как объединить службу драйвера Chrome с желаемыми возможностями для безголового использования xvfb?
- Как передать возможности и параметры в Firefoxdriver с помощью Selenium через Java
- Как решить проблему "Конструктор ChromeDriver(Capabilities) устарел" и WebDriverException: ошибка истечения времени ожидания с ChromeDriver и Chrome