java - 使用 POM 和 PageObjectFactory 测试框架:使用 java 反射时出错
问题描述
我正在构建一个自动化框架并使用页面对象模式。
只有三页,非常简单。最初我在 src/main/java 加上页面代码中做框架代码。我在 src/test/java 中有一个测试运行器类以及步骤定义。但是,我想尝试将框架代码与测试代码放在不同的模块中(因为可重用性,并且因为我显然喜欢让生活变得更难),这会产生一些问题。
我有一个类是 PageObjectFactory ,它的目标是在不存在页面时创建一个页面。因为我只有三页,所以我把这三个
public Homepage getHomePage() {
return (homePage == null) ? homePage = new
Homepage(driver) : homePage;
}
但是现在,由于 PageObjectFactory 不是测试模块的一部分,它在另一个模块中,我不得不想出一个通用方法。我不能在框架模块中放置测试模块的依赖关系,因为我已经在测试模块中具有框架模块的依赖关系,它会生成循环依赖关系。
所以我想出了这个:
public PageObjectsManager getInstance() {
LOG.info("PageObjectsManager getInstance()");
if (instance == null) {
instance = new PageObjectsManager();
}
return instance;
}
public <E extends BasePage> E getPageObject(Class<E> clazz) {
LOG.info("PageObjectsManager getPageObject()");
if (!pageObjectsList.containsKey(clazz)) {
E newPageObject =
createPageObjectInstance(clazz);
pageObjectsList.put(clazz, newPageObject);
LOG.info("Clazz " + clazz);
LOG.info(" " + newPageObject);
}
return clazz.cast(pageObjectsList.get(clazz));
}
private <E extends BasePage> E
createPageObjectInstance(Class<E> clazz) {
LOG.info("PageObjectsManager
createPageObjectInstance()");
E e = null;
try {
Constructor<E> pageConstructor =
clazz.getConstructor();
e = (E) pageConstructor.newInstance();
} catch(InstantiationException | IllegalAccessException |
InvocationTargetException | NoSuchMethodException e1) {
LOG.info("Exception " + e1.getMessage());
}
LOG.info("e " + e);
return e;
这将是逻辑,是有道理的,但不起作用:x 它打印此异常而不是创建页面:
Exception pageobjects.Homepage.<init>()
我应该放弃吗?:( 我认为这太复杂了,我完成这个项目的时间有限,所以也许我会采用将所有内容放在同一个模块中的原始方法。
编辑:我必须创建一个 BasePage 类,它基本上只有一个构造函数:
public BasePage(WebDriver _driver) {
this.driver = _driver;
PageFactory.initElements(driver, this);
wait = new WebDriverWait(driver, 50);
}
然后所有的页面都扩展了这个。
解决方案
推荐阅读
- flutter - 从 Firestore DocumentSnapshot 中检索数组
- android - 使用 AltBeacon 库以 Gatt 服务 UUID 格式进行扫描和广告
- jwt - 将角色属性映射到 keycloak 中的 jwt 令牌
- angular - 如何使用 Ngx Translate 在一个页面中实现多种语言
- swift - UITableView 滚动后以编程方式创建的 UITableViewCell 未正确显示
- reference - Nest.js 中的 Mongoose 子文档
- jenkins - jenkins kubernetes 插件在循环中运行 pod 并且永远不会构建作业
- amazon-web-services - 在 Elastic Beanstack 上扩展 Nginx - NodeJS
- c++ - C++ 上的 MongoDB 投影
- python - 训练 LSTM 自动编码器时出错:“没有为任何变量提供梯度”