Pagefactory初始化

时间:2017-04-10 21:44:02

标签: java selenium-webdriver pageobjects

我用POM和Page Factory方法实现了一个框架。我有一个带有大量init的baseTest类,例如:(每个其他测试类扩展它)

Registration regPage = PageFactory.initelements(driver,Registration.class);
Login loginPage = PageFactory.initelements(driver,login.class);
Details detailsPage = PageFactory.initelements(driver,details.class);
.. (more than 10)

它工作正常,但我想找到更优雅/结构化的方式来处理它。

我尝试将它构建到构造函数中:

public Registeration(WebDriver driver) {
super(driver);
PageFactory.initelements(driver,Registration.class(or can be this));
}

在这种情况下,我得到了一个巨大的堆内存错误,但它会非常好,因为我可以使用一个断言来验证构造函数中的每个pageObject使用标题或页面上的任何元素,对吗?

如何构建我的inits以及如何使用构造函数使用PageFactory处理它?<​​/ p>

谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为initElements陷入了无限循环。 PageFactory的InitElement函数首先使用webdriver参数查找页面的构造函数。就像跑步者的Page Creation调用-> initElements(第二行)-> initElements调用的Page Constructor一样,它一直在盘旋。因此,您不能使用pagefactory在page的构造函数中初始化page类。您可以构建这样的内容

void ucla()
{
   std::cout << "inside ucla" << std::endl;
}

void application_main()
{
   std::cout << "here" << std::endl;
   std::cout << "this file " << std::endl;
   ucla();
}

int main()
{
   const char* outName = argv[2];
   std::string outFile(outName);

   // Save the rdbuf of cout.
   std::streambuf* coutbuf = std::cout.rdbuf();

   termbuf = std::cout.rdbuf();
   if (!outFile.empty())
   {
      std::ofstream outstr;
      outstr.open(argv[2]);
      std::cout.rdbuf(outstr.rdbuf());

      // Needs to be here so that every use of cout will redirect the output
      // to the file.
      application_main();
   }
   else
   {
      // In this branch, use of cout will produce output in the console.
      application_main();
   }

   // Restore the rdbuf of cout.
   std::cout.rdbuf(coutbuf);
}