Нестатический драйвер Webdriver и прослушиватель снимков экрана в TestNG - PullRequest
0 голосов
/ 07 февраля 2019

У меня возникла проблема при параллельном тестировании при захвате снимков экрана с использованием прослушивателей TestNG.

Если я запускаю веб-драйвер STATIC , мои тесты, похоже, посылают неверные данные друг другу, нокажется, что слушатель работает ....

Когда я запускаю веб-драйвер NON STATIC , все потоки работают правильно параллельно, но я получаю исключение NullPointException для файла слушателя.

Есть ли способ обойти это ??Я смотрел на запуск потока как на потокобезопасный или локальный поток, но не уверен, что реализую его правильно

Вот мой код для моего Базового класса

BASEREMOTEPARALLEL2.java

package resources;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.io.FileHandler;

public class baseRemoteParallel2 {

    public WebDriver driver;

    public WebDriver initialiseDriver(String browser) throws IOException {

        if (browser.equalsIgnoreCase("chrome")) {
            System.setProperty("webdriver.chrome.driver",
                    "C:\\Users\\Documents\\Webdriver_Plugins\\chromedriver.exe");

            driver = new ChromeDriver();

        } else if (browser.equals("firefox")) {
            System.setProperty("webdriver.gecko.driver",
                    "C:\\Users\\Documents\\Webdriver_Plugins\\geckodriver.exe");

            driver = new FirefoxDriver();

        } else if (browser.equals("ie")) {
            System.setProperty("webdriver.ie.driver",
                    "C:\\Users\\Documents\\Webdriver_Plugins\\IEDriverServer.exe");

            driver = new InternetExplorerDriver();
        }

        // Set GLOBAL timeout to 5 seconds
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        return driver;
    }

    public void getScreenshotPassed(String result) throws IOException {

        File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

        FileHandler.copy(src,
                new File("C:\\Users\\Documents\\Automated_screenshots\\PASSED\\Testname - " + result + ".png"));
    }

    public void getScreenshotFailed(String result) throws IOException {

        File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

        FileHandler.copy(src,
                new File("C:\\Users\\Documents\\Automated_screenshots\\FAILED\\Testname - " + result + ".png"));

    }
}

Это код в моем Listener.java

package resources;

import java.io.IOException;

import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class listeners implements ITestListener {

    baseRemoteParallel2 b = new baseRemoteParallel2();

    public void onTestStart(ITestResult result) {
        // TODO Auto-generated method stub

    }

    public void onTestSuccess(ITestResult result) {

        // TODO Auto-generated method stub
        try {
            b.getScreenshotPassed(result.getName());
        } catch (IOException e) {
            // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }

    public void onTestFailure(ITestResult result) {
        // TODO Auto-generated method stub
        try {
            b.getScreenshotFailed(result.getName());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void onTestSkipped(ITestResult result) {
        // TODO Auto-generated method stub

    }

    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
        // TODO Auto-generated method stub

    }

    public void onStart(ITestContext context) {
        // TODO Auto-generated method stub

    }

    public void onFinish(ITestContext context) {
        // TODO Auto-generated method stub

    }
}

Ошибка.

java.lang.NullPointerException
    at resources.baseRemoteParallel.getScreenshotPassed(baseRemoteParallel.java:101)
    at resources.listeners.onTestSuccess(listeners.java:24)
    at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:70)
    at org.testng.internal.Invoker.runTestListeners(Invoker.java:1389)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:636)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:40)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:489)
    at org.testng.internal.thread.ThreadUtil$1.call(ThreadUtil.java:52)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Строка 101 в моем коде:это.

    File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете работать с таким интерфейсом:

import java.io.File;

public interface RemoteParallelAccess {

  public baseRemoteParallel2 getRemoteAccess();

}

Ваш тестовый класс должен реализовать этот интерфейс:

class MyTest implements RemoteParallelAccess {

  baseRemoteParallel2 b = new baseRemoteParallel2();

  @Test
  public void doSomeSeleniumStuff() {

  }

  @Override
  public void baseRemoteParallel2 getRemoteAccess() { 
     return b;
  }
}

В своем классе слушателя вы можете использовать

if (result.getInstance() instanceof RemoteParallelAccess) {
  RemoteParallelAccess t = (RemoteParallelAccess) result.getInstance();
  baseRemoteParallel2 b = t.getRemoteAccess();
}

Интерфейс - это общий способ доступа к инкапсулированному веб-драйверу в каждом тестовом классе.Если вы используете статический веб-драйвер в нескольких тестовых классах, состояние веб-драйвера может быть несовместимым.Также могут быть проблемы параллелизма с несколькими потоками TestNG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...