我想知道是否有可能将定位器作为参数传递以使我的函数可重用。我试着自己做,但我得到了"未定义"。而不是工作测试。柏树错误:cy.click()失败,因为它需要一个DOM元素。收到的主题是:
定义
我代码:
Cypress.Commands.add(
"commandName",
(locator, chartValue1) => {
const chartValues = [150, 250, 350, 450, 550, 750, 900];
for (const value of chartValues) {
locator.click(value, chartValue1).then(() => {
mainElementsPage
.mainSideBarHeader()
.should("not.include.text", "(pon.)")
.should("not.include.text", "(wt.)")
.should("not.include.text", "(śr.)");
});
}
}
);
我在测试中使用这个命令:
it("should do something", () => {
cy.commandName(mainElementsPage.chartRect(), 200);
});
mainElementsPage内容:
class mainElementsPage {
chartRect() {
return cy.get("#chart-grid-rect");
}
}
export default mainElementsPage;
看起来你想创建一个子命令。
在您的自定义命令之前的内容作为subject
(相当于locator
)传入
Cypress.Commands.add("commandName", {prevSubject: true},
(subject, chartValue1) => {
const chartValues = [150, 250, 350, 450, 550, 750, 900];
for (const value of chartValues) {
subject.click(value, chartValue1).then(() => {
mainElementsPage.mainSideBarHeader()
.should("not.include.text", "(pon.)")
.should("not.include.text", "(wt.)")
.should("not.include.text", "(śr.)");
});
}
}
)
cy.get("#chart-grid-rect").commandName(200);
// or
mainElementsPage.chartRect().commandName(200);
class MainElementsPage {
chartRect() {
return cy.get("#chart-grid-rect");
}
}
export default new MainElementsPage; // note - new keyword here
为了确保您可以使用mainElementsPage
,您必须首先将此文件导入到您的测试中,如下所示:
import mainElementsPage from '../<some path>/mainElementsPage.js'
然后你需要为它创建一个对象,比如
const mainElements = new mainElementsPage();
那么你可以这样写:
mainElements.chartRect()
我这样做了:
Cypress.Commands.add(
"commandName",
(locator, chartValue1) => {
const chartValues = [150, 250, 350, 450, 550, 750, 900];
for (const value of chartValues) {
locator()
.click(value, chartValue1).then(() => {
mainElementsPage
.mainSideBarHeader()
.should("not.include.text", "(pon.)")
.should("not.include.text", "(wt.)")
.should("not.include.text", "(śr.)");
});
}
}
);
在test中它看起来是:
it("should do something", () => {
cy.commandName(mainElementsPage.chartRect, 200);
});
所以事情是关于添加()到Cypress.Commands.add()中的定位器,并在测试中使用定位器作为字符串。
在Cypress中,不可能同时拥有2个活动命令链。因此,您不能将命令链传递给另一个命令(包括您所做的自定义命令)。所以我看到了四种不同的方法来解决这个问题:
- 使用普通函数代替自定义命令。所以你可以从你的POM对象传递一个链。
- 返回字符串定位器而不是链li>使用子命令链接你的逻辑(参见@Fody的回答)。
- 传递一个函数引用指向你的POM对象函数,并在自定义命令中调用这个函数(参见@wojnarto' answer)。