如何在柏树中传递定位器作为参数?



我想知道是否有可能将定位器作为参数传递以使我的函数可重用。我试着自己做,但我得到了"未定义"。而不是工作测试。柏树错误: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个活动命令链。因此,您不能将命令链传递给另一个命令(包括您所做的自定义命令)。所以我看到了四种不同的方法来解决这个问题:

  1. 使用普通函数代替自定义命令。所以你可以从你的POM对象传递一个链。
  2. 返回字符串定位器而不是链li>使用子命令链接你的逻辑(参见@Fody的回答)。
  3. 传递一个函数引用指向你的POM对象函数,并在自定义命令中调用这个函数(参见@wojnarto' answer)。