Java 将代码放置在单独的测试类中时不执行

Java 将代码放置在单独的测试类中时不执行,java,selenium,selenium-webdriver,testng,page-factory,Java,Selenium,Selenium Webdriver,Testng,Page Factory,我正在为一个使用maven+TestNG的网站编写一个PageFactory框架, 我有页面方面的PageObject类,其中所有特定于页面的web元素和操作都存在,如LoginPageObject,AccountSelectionPageObject。 我有一个“Base”类,其中包含WebDriver、Logger等常见元素。 我有一个“BasePage”类,其中的常见操作包括单击、滚动、选择、刷新。。。在场 MyTestng.xml对所有单独的页面都有单独的条目。 只是我在@BeforeS

我正在为一个使用maven+TestNG的网站编写一个
PageFactory
框架, 我有页面方面的
PageObject
类,其中所有特定于页面的web元素和操作都存在,如
LoginPageObject
AccountSelectionPageObject

我有一个“Base”类,其中包含WebDriver、Logger等常见元素。 我有一个“BasePage”类,其中的常见操作包括单击、滚动、选择、刷新。。。在场

MyTestng.xml对所有单独的页面都有单独的
条目。 只是我在
@BeforeSuiit
中初始化了browser对象,并将其存储/放置在基类中,基类将在我的测试类中进行扩展 下面是我为我的项目设计的流程/拱门。 问题:

我的每个测试类中都有多个@Test。 当我的测试类单独执行时,所有@Test脚本都会执行, 但是当我连续执行它们时,也就是说,我的testng文件对所有测试类都有单独的条目,我的执行就会失败。错误表示无法在页面上找到元素,我有等待语句,但它仍然不工作

我试过调试代码,但找不到原因,因为流在第二页开始时就停止了,异常是“找不到元素”

代码:

预期:
即使按代码页分开,代码也应该完全执行

实际值:
当我将所有页面代码放在一个测试类中时,代码被执行。 但当我将它们分别放在页面测试类中时,将抛出元素not found异常

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"listAccounts"}

在使用PageFactory框架的POM中,应该在PageClass的构造函数中初始化PageFactory。请查找下面的代码片段,它可能适用于您的情况

public class LoginPage extends TestBase {

public LoginPage() {
    PageFactory.initElements(driver, this);//Here driver is initialised in TestBase class and inherited in LoginPage class
}
//your code

@FindBy(id="listAccounts")
WebElement accountDropdown;

public void selectAccount(){
logger.info("Selecting Account");
implicitwait(10);
Select dropdown = new Select(accountDropdown);
logger.info("Drop down is multiple::"+ dropdown.isMultiple());
}
}

克里希纳答案的补充:

PageFactory.initElements(驱动程序,this);
上面的代码可以移动到基类,从LoginPage,您只需像这样在构造函数上传递webdriver

公共类登录页扩展了基本类{
公共登录页面(Webdriver){
超级司机;
}
...
公共类基{
公共基础(Webdriver){
PageFactory.initElements(驱动程序,this);
}
...

我无法从您有限的代码和图表判断您是否正确地实现了pageobject工厂。您是否将驱动程序对象从测试类传递到pageobject类,并且是否调用基本pageobjectclass super,将其传递给驱动程序以初始化页面对象?@BillHileman**我将驱动程序对象传递给实例化Page对象使用Page Factory,但我没有传递驱动程序,因为我没有在类中使用构造函数,因为我没有看到将驱动程序对象传递给super类的必要性,因为我有一个名为Browser的实用程序/帮助程序类,它有一个单例方法,可以在调用的任何位置返回Browser对象。我保留了Page Factory initialize作为TestNG测试方法中的第一条语句,我将其自身分配给全局**调试时,必须首先初始化PageObject,然后调用方法,但是,似乎对象没有初始化,因此抛出元素not found异常
public class LoginPage extends TestBase {

public LoginPage() {
    PageFactory.initElements(driver, this);//Here driver is initialised in TestBase class and inherited in LoginPage class
}
//your code

@FindBy(id="listAccounts")
WebElement accountDropdown;

public void selectAccount(){
logger.info("Selecting Account");
implicitwait(10);
Select dropdown = new Select(accountDropdown);
logger.info("Drop down is multiple::"+ dropdown.isMultiple());
}
}