置于单独的测试类中的代码无法执行

时间:2019-07-07 03:18:32

标签: java selenium selenium-webdriver testng page-factory

我正在使用maven + TestNG来为网站安装PageFactory框架, 我有按页显示的PageObject类,其中显示了所有针对该页面的Web元素和操作,例如LoginPageObjectAccountSelectionPageObject ...
我有一个“基础”类,其中存在诸如WebDriver,Logger之类的常见元素。 我有一个“ BasePage”类,其中包含单击,滚动,选择,刷新...等常见操作

MyTestng.xml对所有单个页面都有单独的<class>条目。 只是我正在初始化@BeforeSuiit中的浏览器对象,并将其存储/放置在Base类中,该类在我的Test类中进行了扩展 以下是我为项目准备的流程/架构。  enter image description here 问题:

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

我已经尝试调试代码,但是由于流程在第二页开始时停止,但找不到元素

,因此无法找到原因

代码:

@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());
}

预期:
即使在分开的代码页中,代码也应完全执行。

实际:
当我将所有页面代码都放在一个测试类中时,将执行代码。 但是,当我将它们分别放置在逐页测试类中时,将引发未找到元素异常。

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

2 个答案:

答案 0 :(得分:0)

在使用PageFactory框架的POM中,应该在PageClasses的Constructor中初始化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());
}
}

答案 1 :(得分:0)

奎师那答案的补充:

PageFactory.initElements(driver, this); 

可以将上面的代码移至基类,并从LoginPage中移出,只需将Webdriver传递给构造函数即可。

public class LoginPage extends Base {

public LoginPage(Webdriver driver) {
    super(driver);
}
...
public class Base {

public Base(Webdriver driver) {
    PageFactory.initElements(driver, this);
}
...