2015-03-25 3 views
1

Мы пытаемся начать внедрение автоматизации для регрессионного тестирования на нашем веб-сайте, основанном на транзакциях. Я успешно установил testng xml для открытия Firefox, IE и Chrome. И он будет запускать класс транзакций. В методе setUP с параметрами он проверяет браузер и открывает правильный браузер для этого потока. Затем он перенаправляется на тест метода main(), который запускает класс Login, прежде чем возвращаться к классу транзакций, чтобы выполнить транзакционный тест. Причиной этого является наличие организованной структуры, которая имеет только один тест в каждом классе для целей отладки.Selenium - многократный браузер и многопользовательский вход в систему

Когда я запускаю этот тест с использованием одного пользовательского мандата, он отлично работает и завершает оба теста. Проблема в том, что наша система позволяет пользователю вводить транзакцию каждые 10 секунд (только одна из наших функций безопасности, чтобы избежать обновления или нескольких представлений транзакций). В любом случае, каков наилучший способ использования нескольких учетных данных пользователя? Я попробовал несколько логики, что я придумал, но каждый раз, когда Firefox будет использовать USERNAME1 и как IE и Chrome будет использовать либо имя пользователя 2 или 3.

Другими словами

  • Firefox = USERNAME1
  • Chrome = USERNAME2
  • IE = USERNAME2

или

  • Firefox = USERNAME1
  • Chrome = Username3
  • IE = Username3

я придумал пару успешных решений, но я должен был дублировать классы или код.

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

Еще одно решение, которое я придумал, принимало метод проверки входа в систему и помещало его в каждый оператор if() в методе параметров класса Transaction при его проверке для каждого браузера. Тогда каждый оператор if будет иметь свое собственное имя пользователя.

Но мне не нравится это решение либо потому, что мне придется добавить этот же код ко всем будущим классам тестов, которые я создам, если я запускаю один тест, чтобы проверить новый код для разрабатываемой функции. Его просто повторяющийся код, который, я думаю, должен быть в своем классе.

Перед тем, как перейти на testng, вы увидите классы входа и транзакции. Кроме того, я создал класс среды, содержащий статические переменные, такие как имя пользователя и URL-адрес.

P.S. Я удалил кучу тестового кода, который не нужен для этого вопроса.

Ex:

static { 
      URL = "https://website.com"; 
      DEFAULT_WAIT_TIME = 60; 
      SYSTEM_ID = "IDnumber"; 
      USERNAME = "Username1"; 
      PASSWORD = "Password1"; 
    } 

import static org.junit.Assert.fail; 

import java.util.concurrent.TimeUnit; 

import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.openqa.selenium.*; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class Login { 
    private WebDriver driver; 
    private String baseURL; 
    private StringBuffer verificationErrors = new StringBuffer(); 

     @Before 
     public void setUp() throws Exception { 
      //driver = new FirefoxDriver(); 
      //baseURL = Environment.URL; 
      driver.manage().timeouts().implicitlyWait(Environment.DEFAULT_WAIT_TIME, TimeUnit.SECONDS); 
     } 

     public static void doLogin(WebDriver driver, String baseURL) { 
      WebDriverWait wait = new WebDriverWait(driver, Environment.DEFAULT_WAIT_TIME); 
      System.out.println("Log in to trunk..."); 
      driver.get(baseURL); 

      wait.until(ExpectedConditions.presenceOfElementLocated(By.id("company_id"))); 
      if (driver.findElement(By.xpath("//div[span='Log In']/span")).isEnabled()) { 
       System.out.println(" 1 - 'Login' page is opened"); 
      } else { 
        System.out.println(" !ERROR! - Can NOT open 'Login' page"); 
        driver.findElement(By.id("This is to throw exception if Can NOT open 'Login' page")); 
       } 
      driver.findElement(By.id("company_id")).clear(); 
      driver.findElement(By.id("company_id")).sendKeys(Environment.SYSTEM_ID); 
      driver.findElement(By.xpath("//input[@name='username']")).clear(); 
      driver.findElement(By.xpath("//input[@name='username']")).sendKeys(Environment.USERNAME); 
      driver.findElement(By.id("c_password")).clear(); 
      driver.findElement(By.id("c_password")).sendKeys(Environment.PASSWORD); 
      System.out.println(" 2 - Info filled"); 

      //I removed the rest of the code that finishes the login because   
      //I don't think it is needed for demonstration 

     } 

     @Test 
     public void main() { 
      doLogin(driver, baseURL); 
     } 

     @After 
     public void tearDown() throws Exception { 
       driver.quit(); 
        String verificationErrorString = verificationErrors.toString(); 
         if (!"".equals(verificationErrorString)) { 
         fail(verificationErrorString); 
         } 
     } 
} 

import static org.junit.Assert.fail; 

import java.util.concurrent.TimeUnit; 

import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.ie.InternetExplorerDriver; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.Select; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class Transaction { 
    private WebDriver driver; 
    private String baseURL; 
    private StringBuffer verificationErrors = new StringBuffer(); 

    public static String country = "22"; 
    public static String ammount = "500"; 

     @Before 
     public void setUp() throws Exception { 
//   System.setProperty("webdriver.ie.driver", "../IEDriverServer.exe"); 
//   driver = new InternetExplorerDriver(); 
      driver = new FirefoxDriver(); 
      baseURL = Environment.URL; 

      driver.manage().timeouts().implicitlyWait(Environment.DEFAULT_WAIT_TIME, TimeUnit.SECONDS); 
     } 

     public static void doTransaction(WebDriver driver) { 
      WebDriverWait wait = new WebDriverWait(driver, Environment.DEFAULT_WAIT_TIME); 
      System.out.println("Performing transaction..."); 


     // This is where the transaction code is ...... 

     } 

     @Test 
     public void transaction() { 
     //Login first 
      Login.doLogin(driver, baseURL); 

     // Transaction 
      doTransaction(driver); 
     } 

     @After 
     public void tearDown() throws Exception { 
       driver.quit(); 
        String verificationErrorString = verificationErrors.toString(); 
         if (!"".equals(verificationErrorString)) { 
         fail(verificationErrorString); 
         } 
     } 
} 

ответ

0

Ваш пример кода JUnit, но вы сказали, что вы используете TestNG. В этом случае вы можете использовать @Parameters для передачи различных параметров в ваши тесты. Doc: http://testng.org/doc/documentation-main.html#parameters

Пример:

testng.xml

<suite> 
    <test name="firstTest"> 
     <parameter name="username" value="username1"/> 
     <parameter name="password" value="password1"/> 
     .... 
    </test> 
     <test name="secondTest"> 
     <parameter name="username" value="username2"/> 
     <parameter name="password" value="password2"/> 
     .... 
    </test> 
</suite> 

Ваш класс:

@Parameters({"username", "password"}) 
    @BeforeTest 
    public void beforeTest(String username, String password) { 
    this.getDriver().get("http://mypage.com"); 
    this.getDriver().findElement(By.id("usernameInputField")).sendKeys(username); 
    this.getDriver().findElement(By.id("passwordInputField")).sendKeys(password); 
    ... 
    } 
+0

Я уверен, что я пытался сделать это один раз, но у меня такая же проблема с 2-браузеров используя одно и то же имя пользователя. Проверьте xml и вопрос в следующем ответе. благодаря – user3672693

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