2017-09-25 21 views
0

Je suis en train de tester une application Web GWT similaire à Paint. Dans ce cas, il y a un test sur lequel je travaille et je dois le tester sur une machine différente en utilisant Selenium Grid. Parallèlement, je teste ce cas de test sur 2 navigateurs en les exécutant parallèlement en utilisant TestNG. Maintenant, le problème auquel je suis confronté dans ce cas de test est que je dois prendre une capture d'écran de l'écran et ensuite l'enregistrer localement dans le dossier créé par moi dans le répertoire de travail actuel. Mais la capture d'écran prise par le 2ème navigateur lors des tests met à jour la capture d'écran prise par le 1er navigateur puisque je n'ai que 1 classe (à tester) pour les deux navigateurs. Tout ce que je veux, c'est que je serais en mesure de prendre une capture d'écran et de les enregistrer avec des noms différents dans mon répertoire local. J'ai beaucoup cherché sur Internet, mais aucune des méthodes n'a fonctionné pour moi et par conséquent, je suis confus sur la façon de le faire.Comment créer un nouveau fichier dans chaque test parallèle en utilisant TestNG + Selenium Grid?

En attendant, voici mon code. D'abord, il y a une classe Browser dans laquelle j'ai donné l'adresse du nœud ainsi que les capacités des navigateurs.

package testNgPackage; 

public class Browser { 
    //ThreadLocal will provide thread-safe tests 
    protected ThreadLocal<RemoteWebDriver> threadLocal = null; 
    @BeforeTest 
    @Parameters("browser") 
    public void setup(String browser) throws MalformedURLException{ 
     String nodeMachine = "http://xxx.xxx.xxx.xxx:5555/wd/hub"; //Providing the IP address of Node 
     if(browser.equalsIgnoreCase("chrome")) { 

      System.setProperty("webdriver.chrome.driver", ".src/Drivers/chromedriver.exe"); 
      DesiredCapabilities capability = null; 
      capability = DesiredCapabilities.chrome(); 
      capability.setPlatform(Platform.VISTA); 
      capability.setBrowserName("chrome"); 
      threadLocal = new ThreadLocal<RemoteWebDriver>(); 
      threadLocal.set(new RemoteWebDriver(new URL(nodeMachine), capability)); 
     } 
     else if(browser.equalsIgnoreCase("firefox")) { 

      System.setProperty("webdriver.gecko.driver", ".src/Drivers/geckodriver.exe"); 
      DesiredCapabilities capability = null; 
      capability = DesiredCapabilities.firefox(); 
      capability.setPlatform(Platform.VISTA); 
      capability.setBrowserName("firefox"); 
      threadLocal = new ThreadLocal<RemoteWebDriver>(); 
      threadLocal.set(new RemoteWebDriver(new URL(nodeMachine), capability)); 
     } 

    } 

    public WebDriver getDriver() { 
     return threadLocal.get(); 
    } 


    @AfterTest 
    public void closeBrowser(){ 
     getDriver().close(); 
    } 

} 

Ensuite, il existe une classe TestNG qui contient le code à tester.

package testNgPackage; 

public class TestNGClass extends Browser{ 

    @Test 
    public void testCanvas() throws InterruptedException{ 
     getDriver().manage().window().maximize(); 
     getDriver().manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ; 
     getDriver().get("XXXX"); //Here I have specified the URL 

     WebDriverWait wait = new WebDriverWait(getDriver(), 10); 
     wait.until(ExpectedConditions.titleContains("xxxxx")); 
     wait.until(ExpectedConditions.elementToBeClickable(By.id("yyyyy"))); 
     Thread.sleep(3000); 
     /* 
      After that, there is a code to click on certain elements and then take the screenshot of the canvas. 
      I won't mention the code here because of the privacy concerns of the company. Along with that, it is useless and wastage of time to mention it here. 
     */ 

     //Given below is the main code which describes how I've specified the file location of Images. 

     File elementImage; 
     File fileBase = new File("./src/Images/baseDrawing.png"); 
     File fileActual = new File("./src/Images/actualDrawing.png"); 
     try { 
      elementImage = this.takeElementScreenshot(canvas,"png"); 
      FileUtils.copyFile(elementImage, fileActual); 
     }catch(IOException e) { 
      e.printStackTrace(); 
     } 
     this.compareImage(fileBase,fileActual); 
     Thread.sleep(6000); 
    } 


    public File takeElementScreenshot(WebElement element, String imageFormat) throws IOException{ 
     /* 
      Code to take the Element Screenshot. The code in this function is correct and I'm not mentioning it here to reduce the reading time of the users. 

     */ 
     } 

    public void compareImage(File fileBase, File fileActual) { 
     /* 
     Code to compare the images by comparing them pixel by pixel. Not mentioning it here. 
     */ 

     } 
} 

C'est le fichier testng.xml dans lequel j'ai spécifié le nom du test à exécuter avec le paramètre.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Parallel test suite" parallel="tests" thread-count="2"> 
    <test name="FirefoxTest"> 
     <parameter name="browser" value="Firefox" /> 
     <classes> 
     <class name="testNgPackage.TestNGClass"/> 
     </classes> 
    </test> 
    <test name="ChromeTest"> 
     <parameter name="browser" value="Chrome" /> 
     <classes> 
     <class name="testNgPackage.TestNGClass"/> 
     </classes> 
    </test> 
</suite> 

Depuis que je suis un débutant dans TestNG, par conséquent, je suis confus comment résoudre mon problème. S'il vous plaît aider.

Répondre

1

Pour enregistrer le fichier image réel avec un nom différent. Soit vous pouvez stocker avec l'identifiant de session ou le nom du navigateur comme indiqué ci-dessous.

Méthode 1: Il suffit de remplacer le code suivant

File fileActual = new File("./src/Images/actualDrawing.png"); 

avec

String sessionId = ((RemoteWebDriver) driver).getSessionId().toString(); 
File fileActual = new File("./src/Images/actualDrawing"+sessionId +".png"); 

Méthode 2: ou remplacer par

Capabilities cap = ((RemoteWebDriver) driver).getCapabilities(); 
String browserName = cap.getBrowserName().toLowerCase(); 
File fileActual = new File("./src/Images/actualDrawing"+browserName+".png"); 

Il peut vous aider.