2

我正在PageFactory使用 maven+TestNG 为网站编写一个框架,我有页面明智的PageObject类,其中存在所有特定于页面的 Web 元素和操作,例如LoginPageObjectAccountSelectionPageObject......
我有一个类“Base”,其中 WebDriver、Logger 等常见元素是展示。我有一个类“BasePage”,其中存在单击、滚动、选择、刷新等常见操作...

MyTestng.xml<class>对所有单独的页面都有单独的条目。只是我正在初始化浏览器对象@BeforeSuiit并将其存储/放置在基类中,该基类正在我的测试类中扩展下面是我为我的项目提出的流程/架构。 问题:在此处输入图像描述

我的每个测试类中都有多个 @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());
}

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

实际:
当我在一个测试类中拥有所有页面代码时,执行代码。但是当我将它们分别放在页面测试类中时,会引发 element not found 异常。

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

2 回答 2

1

在使用 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());
}
}
于 2019-08-17T07:00:27.297 回答
1

对克里希纳回答的补充:

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);
}
...
于 2019-08-17T07:26:18.407 回答