2016-06-21 5 views
0

Я пишу тесты для Selenium WebDriver через webdriver-factory от Java и испытываю проблемы с тестированием. У меня есть этот базовый класс для испытаний:Run Selenium Webdriver TestNG тесты с использованием webdriver-factory

public class BaseTest { 

private WebDriver driver; 

@BeforeSuite 
public void setUp() { 
    WebDriverFactory.setMode(WebDriverFactoryMode.SINGLETON); 
    this.driver = WebDriverFactory.getDriver(DesiredCapabilities.firefox()); 
    driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS); 
    driver.manage().timeouts().setScriptTimeout(40, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 
} 

protected LoginPage navigate(String url) { 
    driver.get(url); 
    return new LoginPage(driver); 
} 

@AfterSuite(alwaysRun = true) 
public void tearDown() { 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    if (driver != null) { 
     WebDriverFactory.dismissAll(); 
    } 
}} 

И два класса, который расширяет этот класс: LoginTest и LogoutTest:

public class LoginTest extends BaseTest { 

@Test 
public void testLoginPage() { 
    LoggedPage lp = navigate(Constants.URL). 
      inputLogin(Constants.LOGIN). 
      selectDomain(Constants.DOMAIN). 
      inputPassword(Constants.PASSWORD). 
      login(); 

    Assert.assertTrue(lp. 
      isUserEmailPresented(), 
      "User e-mail does not presented!"); 

    lp.logout(); 
}} 
public class LogoutTest extends BaseTest { 

private LoggedPage logP; 

@BeforeMethod() 
public void login() { 
    logP = navigate(Constants.URL). 
      inputLogin(Constants.LOGIN). 
      selectDomain(Constants.DOMAIN). 
      inputPassword(Constants.PASSWORD). 
      login(); 
} 

@Test 
public void testLogout() { 
    LoginPage lp = logP.logout(); 

    Assert.assertTrue(lp. 
      isLoginFieldPresented(), 
      "Login field does not presented!"); 

    Assert.assertTrue(lp. 
      isPasswordFieldPresented(), 
      "Password field does not presented!"); 

    Assert.assertTrue(lp. 
      isLoginButtonPresented(), 
      "Login button does not presented!"); 
}} 

Если я запускаю мой TestNG пакет только с LoginTest - он работает правильно. Но если я попробую запустить все мои тесты по набору, LoginPage - прошло, а LogoutPage имеет NullPointerException с помощью метода navigate(). Как я могу это исправить? Мой люкс:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Selenium Web Driver" parallel="methods" thread-count="3"> 
    <test name="Selenium"> 
     <classes> 
      <class name="functional.LoginTest"/> 
      <class name="functional.LogoutTest"/> 
     </classes> 
    </test> 
</suite> 
+0

какой элемент дал вам это NullPointerException? –

+0

@YuZhang 'driver.get (url);' – Giymose

ответ

0

Я думаю, выход из системы(); Метод отсутствует здесь.

+0

Вы имеете в виду метод '@ Test'' logout(); '? – Giymose

0

Для этой проблемы необходимо использовать поле static driver.

0

Мы боролись с подобной ситуацией с нашими усилиями по тестированию. Мы также хотели использовать распараллеливание TestNG вместе с веб-драйвером Selenium. К сожалению, управление жизненным циклом веб-драйвера в каждом тестовом классе или попытка использования статического класса, содержащего веб-драйвер, неэффективны при включении любого из параллельных режимов TestNG. Соответствующие классы и методы, тестируемые с помощью активного потока TestNG и созданного веб-драйвера, были громоздкими, когда они вообще работали. Мы тратили больше времени на выяснение жизненных циклов веб-драйверов, чем на реальные тесты веб-приложений.

В вашем случае, поскольку вы определили <suite parallel="methods">, когда TestNG выполняет классы, создается экземпляр в одном потоке со всеми обработанными @ аннотациями. Однако при параллельном режиме «методы» TestNG создает экземпляр каждого из методов тестовых классов для отдельных потоков. Эти потоки не знают и не могут использовать любые обработанные аннотации, которые, возможно, запустили веб-драйвер, статические или другие. Следовательно, когда ваш метод выполняется, вы получите NPE.

У нас есть проект с открытым исходным кодом, который абстрагирует управление жизненным циклом веб-драйвера для тестирования TestNG/Selenium. Он должным образом поддерживает каждый из параллельных режимов TestNG, предоставляя правильный и активный веб-драйвер для каждого тестируемого метода тестирования. Это очень помогло нам в наших усилиях по тестированию. Возможно, это может быть полезно и в вашем случае. Или, если ничто другое не даст вам представления о том, как вы можете решить это по-другому. Проект завершен на GitHub как Concurrent Selenium TestNG (COSENG). С уважением.

Смежные вопросы