Java 将代码放置在单独的测试类中时不执行
我正在为一个使用maven+TestNG的网站编写一个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
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());
}
}