Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблема вызова драйвера Webdriver+TestNG


(Александра) #1

Здравствуйте. Помогите пожалуйста решить проблему. При запуске сьюта через TestNG , драйвер вызывается заново для каждого класса. А должен вызыватся один и передаватся. При запуске сьюта через Eclipse все работает отлично. 

Запуск браузера по примеру Баранцева (http://selenium2.ru/articles/66-how-to-start-browser-with-driver-factory.html)

 

public class WebDriverFactory
{
  // Factory settings
  private static String defaultHub = null; 
  private static int restartFrequency = Integer.MAX_VALUE;
 
  public static void setDefaultHub(String newDefaultHub)
  {
    defaultHub = newDefaultHub;
  }
 
  public static void setRestartFrequency(int newRestartFrequency) 
  {
    restartFrequency = newRestartFrequency;
  }
 
  // Factory
  
  private static String key = null;
  private static int count = 0;
  private static WebDriver driver;
  private static WebDriverEventListener eventListener;
 
  public static WebDriver getDriver(String hub, Capabilities capabilities)
  {
    count++;
    // 1. WebDriver instance is not created yet
    if (driver == null) {
      return newWebDriver(hub, capabilities);
    }
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    
    // 2. Different flavour of WebDriver is required
    String newKey = capabilities.toString() + ":" + hub;
    if (!newKey.equals(key)) {
      dismissDriver();
      key = newKey;
      return newWebDriver(hub, capabilities);
    }
    // 3. Browser is dead
    try {
    System.out.println(driver.getCurrentUrl());
      driver.getCurrentUrl();
    } catch (Throwable t) {
      t.printStackTrace();
      return newWebDriver(hub, capabilities);
    }
    // 4. It's time to restart
    if (count >= restartFrequency) {
      dismissDriver();
      return newWebDriver(hub, capabilities);
    }
    // 5. Just use existing WebDriver instance
    return driver;
  }
 
  public static WebDriver getDriver(Capabilities capabilities) {
    return getDriver(defaultHub, capabilities);
  }
 
  public static void dismissDriver() {
    if (driver != null) {
      try {
    System.out.println("quit()");
        driver.quit();
        driver = null;
        key = null;
      } catch (WebDriverException ex) {
        // it can already be dead or unreachable
      }
    }
  }
 
  // Factory internals
 
  private static WebDriver newWebDriver(String hub, Capabilities capabilities)
  {
    driver = (hub == null)
        ? createLocalDriver(capabilities)
        : createRemoteDriver(hub, capabilities);
    key = capabilities.toString() + ":" + hub;
    count = 0;
    return driver;
  }
 
  private static WebDriver createRemoteDriver(String hub,
     Capabilities capabilities) {
   try {
     return new RemoteWebDriver(new URL(hub), capabilities);
   } catch (MalformedURLException e) {
     e.printStackTrace();
     throw new Error("Could not connect to WebDriver hub", e);
   }
 } 
 
  private static WebDriver createLocalDriver(Capabilities capabilities)
  {
    String browserType = capabilities.getBrowserName();
    if (browserType.equals("firefox"))
      return new FirefoxDriver(capabilities);
    if (browserType.startsWith("internet explorer"))
      return new InternetExplorerDriver(capabilities);
    if (browserType.equals("chrome"))
      return new ChromeDriver(capabilities);
    if (browserType.equals("opera"))
      return new OperaDriver(capabilities);
    throw new Error("Unrecognized browser type: " + browserType);
  }
 
  static {
    Runtime.getRuntime().addShutdownHook(new Thread()
    {
      public void run() {
        dismissDriver();
      }
    });
  }
}
 
Сами классы по принципу :
 
public class ChatTest
{
 
WebDriver driver;
 
@BeforeMethod
public void setup() 
{
driver = WebDriverFactory.getDriver(DesiredCapabilities.firefox());
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
 
@AfterMethod (alwaysRun = true)
public void unLogin()
{
MyPage my = PageFactory.initElements(driver, MyPage.class);
my.exit();
}
 
@Test
public void SendMessage()
{ тело теста }
 
TestNG.xml:
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
 <test verbose="5" name="test.java">
    <packages>
     <package name="test.java"/>
    </packages>
 </test>
</suite>

 


(Mykhailo Poliarush) #2

в коде особо не разбирался, но если тебе нужно запускать всего лишь один раз для test suite, то поменяй тогда аннотацию на @BeforeSuite


(Александра) #3

в том то и дело, что там код сам определяет перед каждым методом : если браузер ок , то продолжает работу в этом браузере, если capabilities поменялись ,то запускает новый браузер с новыми capabilities, если браузер дает ошибку - открываем новый браузер. И при запуске сьюта просто через Eclipse все отрабатывает отлично. А вот через TestNG проблема. 


(Sergey Korol) #4

1) Как именно вы осуществляете запуск из эклипс и testng?

2) test.java - это точно имя пакета? У вас все классы лежат в директории java?


(Александра) #5

1. Эклипс: правой кнопкой мыши по пакету  - run as - testNG . testng: правой кнопкой мыши по xml - run as -testNG (или run -run config - выбираем в поле suite xml файл - run)

2. test.java это имя пакета. точно. в директории java лежат только тестовые классы. кроме него есть ещё пакет с Драйвером и пакет с pages  


(Sergey Korol) #6

Скорее всего проблема где-то в конфигурации. Видимо, как-то неправильно вашу xml подключаете, или драйвер случайно убиваете в тестах. Ради интереса скопипастил ваш код, создал 2 класса (по 2 теста в каждом), которые открывают 4 разные странички, подсунул xml с указанием пакета -> в 1 окне все прошло на ура. Вы уверены, что по окончанию теста нигде не делаете driver.quit() или close()?


(Александра) #7

Когда запускаю из эклипс, все 30 тестов проходят на ура в практически в одном браузере (один раз браузер переоткрывается, так как меняются capabilities ). Я уверена , что проблема гдето в конфигурации , только вот вопрос где? Может и неправильно xml подключаю ... Спасибо за помощь...Буду искать в чем проблема. (


(Александра) #8

Перенесла все свои тесты с Windows на Mint (давно собиралась это сделать). Не знаю в чем была проблема , но теперь все работает отлично. )