javascript - JavaScript 类:在构造函数与 get 方法中存储变量
问题描述
所以我正在使用页面对象模型模式和赛普拉斯(用 JavaScript 编写)开发一个自动化框架。
对于页面的某些部分,我正在制作页面组件(本质上是较小的页面对象)。为了减少维护,我想为 Web 元素存储“定位器”以便于访问(以防它们发生变化)。
我将在更大的方法(组合多个元素并用它们做事)中在类中进一步引用这些定位器。但是我不确定存储它们的最佳方式。
想到了两个选项(我不是 JavaScript 专家,所以可能有更好的方法。无论如何有..
选项 1:(将它们存储在简单的 GET 方法中,如下所示):
saveButton() {
return cy.contains('Save')
}
nameField() {
return cy.get('.form-control[name="name"]')
}
descriptionField() {
return cy.get('.form-control[name="description"]')
}
然后,当我需要访问定位器时,我只需在类更大的方法中调用nameField().type()
或saveButton().click()
进一步调用(尽管我想我需要this
在它们之前添加。
通过使用构造函数,另一个选项将是这样的:
选项2:(使用构造函数)
class WidgetForm extends PageObject {
constructor() {
this.saveButton = 'Save'
this.nameField = '.form-control[name="name"]'
this.descriptionField = '.form-control[name="description"]'
}
//...more code further down that uses these values
然后我可以以类似的方式引用它们,例如cy.get(this.nameField).type()
虽然我想我也可以将整个赛普拉斯命令函数存储在构造函数值中,例如:
this.nameField = cy.get('.form-control[name="name"]')
(至少我假设)。
两者都有什么特别的优势吗?我希望 JavaScript 允许将常量私有值存储在类似于其他语言的类中(我知道它会出现在 ES7 中,但我想坚持现在的工作方式)。
显然,欢迎任何其他建议。出于某种原因Option 1
,我看起来更好。但我不确定定义这么多功能是否更慢/更丑。
解决方案
选项 1 对我来说看起来不错,组织更直观,我认为最终结果看起来更好。
Class WidgetForm {
nameField() {
return cy.get('.form-control[name="name"]')
}
}
然后在你的测试中:
beforeEach(function () {
WidgetForm.nameField().type({"Smith"})
})
不确定您的第二个建议是否是这个意思,但您可以使用吸气剂:
Class WidgetForm extends PageObject{
constructor() {
this.saveButton = 'Save'
this.nameField = '.form-control[name="name"]'
this.descriptionField = '.form-control[name="description"]'
}
get nameField() {
return cy.get(this.nameField)
}
}
推荐阅读
- php - Laravel 8 为同一路径返回两个不同的文件夹
- css - CSS 悬停两个元素
- c# - Input.getaxis("mouse Y") 总是返回 0
- python - Python discord bot 随机数生成器
- java - 无法连接到 mysql 数据库。驱动程序管理器错误。Java + netBeans
- mongodb - 数数
- python - 为什么在更新我的代码并删除给我错误的函数后,我不断收到 AttributeError?
- java - 在字符串数组列表中使用 compareto() 进行插入排序
- html - 有时不会触发DIV内的Ionic 4 App点击事件
- api - Strava - 如何检测运行/活动中的暂停