BrowserManager реализация BrowserFactory

проф. кандидат наук. Бони Гарсия создал отличный инструмент для 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!


person Dejan Zivanovic    schedule 20.05.2017    source источник
comment
Я бы предложил отредактировать ваш вопрос, сделав его менее многословным, более точным. Этот вопрос трудно понять.   -  person lax1089    schedule 21.05.2017


Ответы (1)


Попробуйте обновить все зависимости Selenium до 3.4.0 из-за драйвера Firefox Gecko 0.16.1. Его нет в SeleniumHQ, но он доступен в репозитории mvn. Меня устраивает...

Обновление: для Opera похоже, что WebDriverManager использует более старую версию драйвера. Просто добавил Taobao в качестве репозитория драйверов, и он отлично работает: OperaDriverManager.getInstance().useTaobaoMirror().setup();

person Uros Gavric    schedule 20.05.2017
comment
Отлично, это решило проблему для FF! Но это не работает для других водителей. Я думаю, что менеджер веб-драйверов должен быть обновлен. - person Dejan Zivanovic; 21.05.2017
comment
вот для IE и Selenium 3.4.0 private static InternetExplorerDriver getIEInstance() { InternetExplorerDriverManager.getInstance().version(3.4).setup(); Возможности DesiredCapabilities = DesiredCapabilities.internetExplorer(); Возможности.setCapability(CapabilityType.ACCEPT_SSL_CERTS, правда); Возможности.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, правда); Возможности.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, правда); Драйвер InternetExplorerDriver = новый InternetExplorerDriver (возможности); возврат водителя; } - person Dejan Zivanovic; 21.05.2017