【问题标题】:Non Static Webdriver driver and screenshot listener in TestNGTestNG 中的非静态 Webdriver 驱动程序和屏幕截图侦听器
【发布时间】:2019-07-01 22:47:10
【问题描述】:

我在使用 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);

【问题讨论】:

  • 好吧,您在侦听器中使用了 baseRemoteParallel2 类的单独实例。它仅适用于静态字段,因为静态字段与所有类实例共享。使用普通字段,每个实例都有自己的驱动程序,您需要实际的测试实例才能获得正确的驱动程序。
  • 我该怎么做??我可以使用扩展调用 baseRemoteParallel2 吗?
  • 这是一个使用线程的模板,具有非静态驱动程序对象并设法截取屏幕截图。它应该可以帮助您:github.com/Ardesco/Selenium-Maven-Template

标签: java selenium selenium-webdriver webdriver testng


【解决方案1】:

您可以使用这样的界面:

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();
}

接口是访问每个测试类中封装的 webdriver 的通用方式。如果您在多个测试类中使用静态 webdriver,则 webdriver 的状态可能不一致。多个 TestNG 线程也可能存在并发问题。

【讨论】:

  • 不确定这个解决方案是否有效,因为我使用监听器快速收集失败测试的屏幕截图,我希望得到超过 1000 个测试,所以这种方法对我不起作用(因此监听器真的很有用)。有办法我现有的代码可以访问非静态驱动程序????代码运行良好,除了在并行运行时。
  • 现在您应该了解如何访问您的非静态驱动程序了。
猜你喜欢
  • 2013-07-10
  • 2018-06-20
  • 1970-01-01
  • 2021-04-11
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多