1

У меня есть файл функцию, где у меня есть 2 сценариятестирования различных сценариев в «Селен огурца с Java» без открытия нового веб-браузера

Feature: Login to Online Store 

Scenario: Login successful with valid credentials 
    Given User is on Home Page 
    When User navigates to Login Page 
    And User provides username and password 
    Then Message displays Login successfully 

Scenario: User logout successfully 
    When User logouts from application 
    Then Message displays Logout successfully 

Каждый раз, когда я запустить файл RunFeatures.java, после того, как первый Сценарий, драйвер для открытия нового браузера для выполнения следующего сценария. Можно ли использовать тот же браузер для выполнения второго сценария? Ниже мой код:

RunFeatures.java

package cucumbertest; 

import org.junit.runner.RunWith; 

import cucumber.api.CucumberOptions; 
import cucumber.api.junit.Cucumber; 

@RunWith(Cucumber.class) 
@CucumberOptions(features="src/test/java/features/" 
      ,glue={"steps"} 
      ,dryRun=false 
      ,monochrome=false) 

public class RunFeatures 
{ 
} 

ClientSteps.java:

package steps; 

import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.api.java.en.*; 
import pages.HomePage; 
import pages.LoginPage; 

public class ClientSteps 
{ 
    WebDriver driver=new FirefoxDriver(); 
    @Given("^User is on Home Page$") 
    public void user_is_on_Home_Page() throws Throwable { 
     new HomePage(driver).user_is_on_Home_Page(); 
    } 

    @When("^User navigates to Login Page$") 
    public void user_navigates_to_Login_Page() throws Throwable { 
     new HomePage(driver).user_navigates_to_Login_Page(); 
    } 

    @When("^User provides username and password$") 
    public void user_provides_username_and_password() throws Throwable { 
     new LoginPage(driver).user_provides_username_and_password(); 
    } 

    @Then("^Message displays Login successfully$") 
    public void message_displays_Login_successfully() throws Throwable { 
     new LoginPage(driver).message_displays_Login_successfully(); 
    } 

    @When("^User logouts from application$") 
    public void user_logouts_from_application() throws Throwable { 
     new LoginPage(driver).user_Logout_from_the_Application(); 
    } 

    @Then("^Message displays Logout successfully$") 
    public void message_displays_Logout_successfully() throws Throwable { 
     new LoginPage(driver).message_displayed_Logout_successfully(); 
    } 
} 

Homepage.java файл

package pages; 

import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.api.java.en.Given; 
import cucumber.api.java.en.When; 

public class HomePage 
{ 
    WebDriver driver; 


    public HomePage(WebDriver driver) 
    { 
     this.driver=driver;  

    } 
    public void user_is_on_Home_Page() throws Throwable { 

     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
     driver.manage().window().maximize(); 
     driver.get("http://www.store.demoqa.com"); 

    } 

    public void user_navigates_to_Login_Page() throws Throwable { 
     driver.findElement(By.xpath(".//*[@id='account']/a")).click(); 
    } 

} 

LoginPage.java

package pages; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.api.java.en.Then; 
import cucumber.api.java.en.When; 

public class LoginPage 
{ 
    WebDriver driver; 
    public LoginPage(WebDriver driver) 
    { 
     this.driver=driver; 
    } 

    public void user_provides_username_and_password() throws Throwable { 
     // This is to get the first data of the set (First Row + First Column) 
     driver.findElement(By.id("log")).sendKeys("tri.nguyen"); 
     // This is to get the first data of the set (First Row + Second Column) 
     driver.findElement(By.id("pwd")).sendKeys("[email protected]"); 
     driver.findElement(By.id("login")).click(); 
    } 


    public void message_displays_Login_successfully() throws Throwable { 
     System.out.println("Login Successfully"); 
    } 

    public void user_Logout_from_the_Application() throws Throwable { 
     driver.findElement (By.xpath(".//*[@id='account_logout']/a")).click(); 
    } 


    public void message_displayed_Logout_successfully() throws Throwable { 
     System.out.println("Logout Successfully"); 
     driver.quit(); 
    } 
} 
+0

Это потому, что вы создаете экземпляр WebDriver в своем классе шагов. Вы должны изучить использование крючков. Я провел некоторое исследование и обнаружил, что cucumber-jvm не поддерживает глобальные перехватчики по умолчанию, но есть обходные пути, которые вы могли бы попробовать. – RemcoW

+0

Спасибо @RemcoW. Не могли бы вы рассказать мне больше о крючках? Я новичок в Selenium. –

+0

https://stackoverflow.com/questions/35547776/serenity-cucumber-browser-unique-session-per-feature/35720040#35720040 –

ответ

1

Как хорошая практика, тестовые случаи должны быть атомарными. Тест автоматизации не должен зависеть от другого тестового примера для экземпляра браузера, данных и т. Д.

Вы должны закрыть все окна браузера после каждого тестового примера и снова открыть браузер в качестве нового экземпляра для следующего тестового примера.

Используйте @Before и @After в вашем файле stefdef для этого.

+0

У вас есть документ/источник, на который я могу ссылаться? –

+0

Это хорошо читать.(Http://www.sustainabletdd.com/). У меня есть книга, написанная автором в этом блоге, я могу опубликовать что-то с примерами, чтобы сделать ее простой в моем собственном блоге (http://testautomationsimplified.com/). –

+0

Я могу согласиться лишь частично на эту теорию. Мы должны попытаться подражать нашим тестовым примерам, насколько это возможно, как реальных пользователей, и как пользователь я не буду закрывать браузер после каждой транзакции. Я хотел бы случайно передать экземпляр драйвера в мои тестовые примеры. –

1

как я не могу добавить комментарий в связи с ограничениями по словам, написание здесь здесь как ответ еще раз! Это продолжается до моего предыдущего поста. Вы можете попробовать это. Замены @Given следуя

WebDriver driver; 
    @Before 
    public void setUp(){ 
     driver=new FirefoxDriver(); 
    } 

    @After 
    public void cleanUp(){ 
     driver.quit(); 
    } 
    @Given("^User is on Home Page$") 
    public void user_is_on_Home_Page() throws Throwable { 
     new HomePage(driver).user_is_on_Home_Page(); 
    } 

убедитесь, что вы импортировать следующие файлы только и не JUnit *

import cucumber.api.java.After; 
import cucumber.api.java.Before; 
0

Я попытался изменить свои коды ниже вашей инструкции, но его получение NullPointer исключение:

WebDriver driver; 
    @Before 
    public void setUp(){ 
     WebDriver driver=new FirefoxDriver(); 
    } 

    @After 
    public void cleanUp(){ 
     driver.quit(); 
    } 

    @Given("^User is on Home Page$") 
    public void user_is_on_Home_Page() throws Throwable { 
     new HomePage(driver).user_is_on_Home_Page(); 
    } 

Исключение:

java.lang.NullPointerException 
    at pages.HomePage.user_is_on_Home_Page(HomePage.java:24) 
    at steps.ClientSteps.user_is_on_Home_Page(ClientSteps.java:30) 
    at ✽.Given User is on Home Page(Login.feature:4) 

java.lang.NullPointerException 
    at steps.ClientSteps.cleanUp(ClientSteps.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
0

Я снова не смог добавить комментарий. Вы указали и инстанцировали переменную драйвера внутри метода настройки, что делает его локальным только для метода настройки. Объявить драйвер на уровне класса.

WebDriver driver; 
    @Before 
    public void setUp(){ 
     driver=new FirefoxDriver(); 
    } 

Это должно сработать. Дайте мне знать, если вы столкнетесь с какими-либо проблемами, мы можем получить видеовстречу, чтобы решить эту проблему.

+0

Спасибо Абхиджит, он все еще не работает. org.openqa.selenium.NoSuchElementException: Не удается найти элемент: {"method": "xpath", "selector": ".//*[@ id = 'account_logout']/a"} Длительность или таймаут команды: 28 миллисекунды. После завершения первого запуска сценария браузер закрывается. Я хочу, чтобы второй сценарий продолжался после 1-го сценария без закрытия браузера и экземпляра нового. Является ли это возможным? –

+0

его проблема diff сейчас. Похоже на вопрос синхронизации. добавить Неявное ожидание. если ваш xpath правильный и его видимый на странице, то это решит проблему. добавьте это в свой метод установки после того, как драйвер = новый FirefoxDriver(). 'driver.manage(). timeouts(). implicitlyWait (30, TimeUnit.SECONDS);' –

+0

Спасибо Абхиджит, как я уже говорил. Второй сценарий будет основываться на 1-м сценарии, поэтому браузер после 1-го сценария не может быть закрыт, чтобы элемент мог быть расположен драйвером во втором сценарии. Является ли это возможным? Во всяком случае, моя видеовстреча - ** quangtringuyen2005 ** –