【问题标题】:how to get WebDriver for my Listener class when using "public ThreadLocal<WebDriver> webdriver = new ThreadLocal<WebDriver>();" method使用“public ThreadLocal<WebDriver> webdriver = new ThreadLocal<WebDriver>();”时如何为我的 Listener 类获取 WebDriver方法
【发布时间】:2022-01-02 12:10:38
【问题描述】:

我的 Listener 的 WebDriver 不断收到 NullPointerException。这是因为我在基类的 WebDriver 上使用了 ThreadLocal 吗?如果是这样,我如何为我的侦听器的 onTestSuccess 方法获取测试用例的驱动程序?

这是我的监听类:

@Override
    public void onTestSuccess(ITestResult result) {
        extentTest.get().log(Status.PASS,"Test Passed");
        WebDriver driver = null;
        Object testObject = result.getInstance();
        Class clazz = result.getTestClass().getRealClass();
        try {
            driver = (WebDriver)clazz.getField("webdriver").get(testObject);
        } catch (Exception e) {
        }
        try {
            extentTest.get().addScreenCaptureFromPath(getScreenShotPath(result.getMethod().getMethodName(), driver), result.getMethod().getMethodName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

基类:

public ThreadLocal<WebDriver> webdriver = new ThreadLocal<WebDriver>();


@BeforeClass
public void setup() {
    Reporter.log("@@@@@ Setup @@@@@",true);
    ExtentReports extent = ExtentReport.extentReportGenerator();
}


@BeforeMethod
public void startBrowser() {
    WebDriverFactory webDriverFactory = new WebDriverFactory();
    webDriverFactory.setDriver();
    webdriver.set(webDriverFactory.getDriver());
    webdriver.get().get(baseURL);

TestCase 类:

@Test(dataProvider = "jsonData", dataProviderClass = TestData.class)
public void  testAggregator(String jSon) throws ParseException {
    extent.createTest("Test The Welcome Page");
    welcomePageImpl = new WelcomePageImpl(webdriver.get());
    welcomePageImpl.getAggregatorRequest(webdriver.get(),jSon);
}

例外:

java.lang.NullPointerException
    at main.java.com.shoppingCart.testCases.BaseClass.getScreenShotPath(BaseClass.java:71)
    at main.java.com.shoppingCart.utilities.Listeners.onTestSuccess(Listeners.java:37)
    at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:70)
    at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:219)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:651)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 如果您将异常堆栈跟踪发布到 4-5 级,这将有所帮助。
  • 我添加的异常是否正确?
  • 啊,我想我已经解决了。我不得不将 WebDriver 设置为公共大声笑
  • 并从 BaseClass.class 中获取类;而不是测试类
  • 啊,没关系。它仅在我不使用 ThreadLocal webdriver 时才有效

标签: java selenium selenium-webdriver testng


【解决方案1】:

问题出在您的测试代码中。

TestNG 不保证onSuccess 与您的测试方法在同一线程中运行。

要解决此问题,请通过 TestNG 侦听器接口 org.testng.IInvokedMethodListener 重构您的侦听器以使用 beforeInvocationafterInvocation,因为这保证在同一个线程上运行(据我所知)。

【讨论】:

  • 是的,我尝试了它并了解到它为每种方法创建测试。我想要一些东西,它可以获取单个@Test 方法并在它失败或通过报告器中的@test 方法标题时创建屏幕截图。
  • 找到了问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 2018-05-23
  • 2021-04-17
  • 2017-06-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2019-09-13
相关资源
最近更新 更多