проф. кандидат наук. Бони Гарсия создал отличный инструмент для QA Automation WebDriverManager.
Как вы можете видеть на github, он сделал отличное решение для того, чтобы НЕ загружать вручную последнюю версию браузера и не устанавливать переменные абсолютного пути.
System.setProperty("webdriver.chrome.driver", "/absolute/path/to/binary/chromedriver");
Сейчас я покажу вам, как вы можете настроить и использовать его, если вы используете конкретизацию в своем проекте. По сути, это реализация Browser Factory, которую я сделал с помощью TestNG, Maven и Selenium.
Сначала в вашем POM.XML добавьте
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>1.6.2</version>
</dependency>
Создайте класс BrowserFactory в своем проекте следующим образом:
import io.github.bonigarcia.wdm.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.opera.OperaDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.safari.SafariDriver;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class BrowserFactory {
public static WebDriver GetBrowser(String browserName) {
browserName = browserName.toLowerCase();
if(browserName.equals("chrome"))
return getChromeInstance();
if(browserName.equals("edge"))
return getEdgeInstance();
if(browserName.equals("ie"))
return getIEInstance();
if(browserName.equals("phantomjs"))
return getPhantomJSInstance();
if(browserName.equals("opera"))
return getOperaInstance();
else
return getFFInstance();
}
private static FirefoxDriver getFFInstance() {
FirefoxDriverManager.getInstance().setup();
FirefoxDriver driver=new FirefoxDriver();
return driver;
}
private static ChromeDriver getChromeInstance() {
ChromeDriverManager.getInstance().setup();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_setting_values.notifications", 2);
prefs.put("credentials_enable_service", false);
prefs.put("password_manager_enabled", false);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
ChromeDriver driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().window().maximize();
return driver;
}
private static InternetExplorerDriver getIEInstance() {
InternetExplorerDriverManager.getInstance().setup();
InternetExplorerDriver driver=new InternetExplorerDriver();
return driver;
}
private static PhantomJSDriver getPhantomJSInstance() {
PhantomJsDriverManager.getInstance().setup();
PhantomJSDriver driver=new PhantomJSDriver();
return driver;
}
public static EdgeDriver getEdgeInstance() {
EdgeDriverManager.getInstance().setup();
EdgeDriver driver=new EdgeDriver();
return driver;
}
public static OperaDriver getOperaInstance() {
OperaDriverManager.getInstance().setup();
OperaDriver driver=new OperaDriver();
return driver;
}
}
Теперь в вашем TestNG testing.xml добавьте параметр браузера, например:
<suite name="YTCommentator" >
<parameter name="browser" value="chrome"/>
<test name="YTComments">
<parameter name="email" value=""/>
<parameter name="password" value=""/>
<parameter name="searchFor" value=""/>
<parameter name="comment" value=""/>
<parameter name="repeatTimes" value=""/>
<classes>
<class name="CommentsTest" />
</classes>
</test>
</suite>
В вашем тесте добавьте новый @BeforTest с этим параметром
@BeforeTest
@Parameters({"browser"})
public void setup(String browser){
driver =BrowserFactory.GetBrowser(browser);
}
И это все :)
Проблема в том, что теперь только Chrome работает с WebDriverManager. Другие драйверы, такие как FF, имеют ошибки :((
1495307903858 geckodriver ИНФО Прослушивание на 127.0.0.1:36758
1495307904514 geckodriver::marionette INFO Запуск браузера \?\C:\Program Files (x86)\Mozilla Firefox\firefox.exe с аргументами ["-marionette"]
1495307904773 addons.manager ОШИБКА при запуске: [Исключение... «Компонент вернул код ошибки: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIFile.create]» nsresult: «0x80070057 (NS_ERROR_ILLEGAL_VALUE)» местоположение: «JS-кадр :: resource://gre/ modules/FileUtils.jsm :: FileUtils_getDir :: строка 70" данные: нет] Трассировка стека: FileUtils_getDir()@resource://gre/modules/FileUtils.jsm:70 ‹ FileUtils_getFile()@resource://gre/modules/ FileUtils.jsm:42 ‹ AddonManagerInternal.validateBlocklist()@resource://gre/modules/AddonManager.jsm:700 ‹ AddonManagerInternal.startup()@resource://gre/modules/AddonManager.jsm:870 ‹ this.AddonManagerPrivate. startup()@resource://gre/modules/AddonManager.jsm:3033 ‹ amManager.prototype.observe()@resource://gre/components/addonManager.js:65
Ошибка JavaScript: resource://gre/modules/AddonManager.jsm, строка 1677: NS_ERROR_NOT_INITIALIZED: AddonManager не инициализирован
1495307905408 Marionette INFO Прослушивание порта 55052
Ошибка JavaScript: resource://gre/modules/AddonManager.jsm, строка 2585: NS_ERROR_NOT_INITIALIZED: AddonManager не инициализирован
org.openqa.selenium.SessionNotCreatedException: невозможно создать новый удаленный сеанс. желаемые возможности = возможности [{moz:firefoxOptions={binary=Optional.empty, args=[], legacy=null, logLevel=null, prefs={}, profile=null}}], требуемые возможности = возможности [{moz: firefoxOptions={binary=Optional.empty, args=[], legacy=null, logLevel=null, prefs={}, profile=null}}]
Информация о сборке: версия: «3.3.1», ревизия: «5234b325d5», время: «2017-03-10 09:10:29 +0000».
Информация о системе: хост: «HP», ip: «192.168.10.101», os.name: «Windows 10», os.arch: «amd64», os.version: «10.0», java.version: «1.8.0_101». '
Информация о драйвере: версия драйвера: FirefoxDriver
в org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126)
Пожалуйста, обновите WebDriverManager, и у нас будет отличный инструмент, который поможет нам в автоматизации и CI!