【发布时间】:2019-07-29 09:41:54
【问题描述】:
这是一个我找不到确切来源的问题,我希望根据用户以前的经验得到一些答案,主要是解释为什么某种方法没有行得通。
我正在通过 Protractor 使用 webdriver 进行自动化,并且正在就是否应该在页面对象本身之外提供页面元素进行辩论。经过研究,人们似乎采取了几种不同的方法,我无法完全掌握每种方法的长期影响。
我见过以下页面对象模型的不同实现:
定位器在页面对象中声明并导出
这是我最不喜欢的方法,因为它意味着元素实际上在测试中被识别。这似乎是一个不好的标准,因为它可能鼓励自动化程序直接在应用程序中使用新的定位器,而不是来自页面对象。 此外,任何需要动态信息的都不能在PO初始化时直接设置,需要进一步编辑。
pageobject.js
export default class HomePage {
constructor() {
this.passwordField = '#password';
this.usernameField = '#user';
}
}
test.js
const homePage = new HomePage();
$(homePage.usernameField ).sendKeys('admin');
$(homePage.passwordField ).sendKeys('password');
在页面对象中声明并导出的元素,定位器不是
pageobject.js
export default class HomePage {
constructor() {
this.passwordField = $('#password');
this.usernameField = $('#user');
}
}
test.js
const homePage = new HomePage();
homePage.usernameField.sendKeys('admin);
homePage.passwordField.sendKeys('password);
在页面对象中声明的元素,仅在页面对象中直接使用,仅导出方法
这是我过去使用的方法,我们最终得到了很多很多功能。例如,我们有 setUsename(), getCurrentUsername(), getUsernameAttibute(), verifyUsernameExists() 和 password 元素和许多其他元素。我们的页面对象变得很大,所以我觉得这不再是最好的方法了。
然而,其中一个优点是我们的测试看起来非常干净且可读性很强。
pageobject.js
export default class HomePage {
constructor() {
var passwordField= $('#password');
var usernameField = $('#user');
}
setUserName(name){
username.sendKeys(name);
};
setPassword(password){
passwordField.sendKeys(password);
};
}
test.js
const homePage = new HomePage();
homePage.setUsername('admin');
homePage.setPassword('123');
我很想得到一些反馈,希望您能抽出时间阅读。
【问题讨论】:
-
我喜欢到目前为止提交的两个答案,但我正在添加赏金以尝试生成其他一些观点。
标签: selenium-webdriver protractor webdriver automated-tests pageobjects