【问题标题】:The WebDriver object is null in the @BeforeTest method in the test class测试类中@BeforeTest方法中的WebDriver对象为null
【发布时间】:2020-08-16 12:48:17
【问题描述】:

我正在使用Page Object Model + PageFactory + @Factory + @DataProvider

我有 6 个用户要运行,问题是我无法在同一个浏览器实例中登录 2 个用户;每个用户只能在新的浏览器实例中登录。

所以我创建了 6 个套件,每个用户一个,并且一次运行所有的套件。 (驱动对象创建于@BeforeSuite
每个套件包含多个测试标签,每个测试标签包含多个类标签;类标签的数量由@Factory 决定
我正在以编程方式创建我的 testng.xml。

看起来像这样:

<suite name="user1">
  <test>
    <classes>
      <class name="SearchPerson" />
      .
      .
      .
      <class name="SearchPerson" />
    </classes>
  </test>

  <test>
    <classes>
      <class name="PrintPerson" />
      .
      .
      .
      <class name="PrintPerson" />
    </classes>
  </test>
</suite>

and similarly 5 more suites for the other 5 users

这是项目结构:

SearchPerson extendsTestEngine extendsTestBase

TestBase.java

public WebDriver webDriver;

public createChromeDriver(){
  System.setProperty("webdriver.chrome.driver", path to chromedriver.exe);
  webDriver = new ChromeDriver();
}

TestEngine.java

public TestEngine extends TestBase{

  @BeforeSuite
  public void setUp(){
     createChromeDriver();
     webDriver.get("https://www.google.com");
  }

  @DataProvider
  public static Object[][] getTestData(){
     return Object[][]{ {"name1"}, {"name2"} };
  }

  @AfterSuite
  public void close(){
     webDriver.quit();
  }

}

我的实际测试 - SearchPerson.java

public class SearchPerson extends TestEngine{

  String name;
  Person person;

  @Factory(dataProvider = getTestData, dataProviderClass = TestEngine.class)
  public SearchPerson(String name){
      this.name = name;
  }

  @BeforeTest
  public void initPageObjects(){
     person = new Person(webDriver);
  }

   @Test
   public void setName(){
      person.setName(name);
   }

   @Test
   public void printName(){
      person.printName();
   }
}    

我也不想让我的 WebDriver 对象静态,因为我计划并行化我的测试。

【问题讨论】:

    标签: java selenium-webdriver testng factory pageobjects


    【解决方案1】:

    TL;DR
    1.可以从配置方法中保存属性,以后可以从任何其他带注释的方法中访问这些属性
    2. 在@BeforeSuite 中创建的对象仅可用于该套件中的第一个测试

    在 TestNG Google Group 上问了同样的问题后,我发现在 @BeforeSuite 中创建的对象只能用于该套件中的第一个测试。

    所以我改变了我的 XML,让标签代表用户,而不是标签。

    我的新 XML 如下所示:

    <suite>
      <test name="user1">
        <classes>
          <class name="PrintPerson" />
          ..
          <class name="PrintPerson" />
          <class name="SearchPerson" />
          ..
          <class name="SearchPerson" />
        </classes>
      </test>
    
      <test name="user2">
        <classes>
          <class name="PrintPerson" />
          ..
          <class name="PrintPerson" />
          <class name="SearchPerson" />
          ..
          <class name="SearchPerson" />
        </classes>
      </test>
    </suite>
    

    我学到的另一件重要的事情是,可以从配置方法中保存属性,以后可以从任何其他带注释的方法中访问这些属性。 在我的例子中,由于我现在在 @BeforeSuite 中初始化了我的 WebDriver 对象,我将这个对象保存在属性“webDriver”下

    @BeforeSuite
    public void beforeSuite(ITestContext testContext){
       driver = new ChromeDriver();   
       testContext.setAttribute("webDriver", driver);
    }
    

    并在我的测试类的@BeforeTest 中访问它

    
    class Test1{
       WebDriver driver;
       
       @BeforeTest
       public void beforeTest(ITestContext testContext){
          driver = (WebDriver) testContext.getAttribute("webDriver");
       }
    
       @Test
       public void testMethod(){
          driver.get("https://www.google.com");
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2010-09-05
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多