【问题标题】:how to I store element text from cypress chain into a variable in typescript?如何将柏树链中的元素文本存储到打字稿中的变量中?
【发布时间】:2020-01-28 23:55:55
【问题描述】:

我想要一些测试用例来比较 tolPage 文本值是否与 curPage 文本值相同,如下所示。但它不起作用,我应该如何将元素文本从柏树链传递到局部变量

class Menu{
  tolPage() {
    return cy
      .get(selectors.pagination.totalPageCount)
      .invoke('text')
      .then((text) => {
        return text.toString();
      });
  }
  curPage() {
    return cy
      .get(selectors.pagination.currentPageCount)
      .invoke('text')
      .then((text) => {
        return text.toString();
      });
  }
}
describe('check two function should be eq') {
  const menu = new Menu();
    it('Verified "', () => {
      let text = menu.curPage();
      # menu.tolPage().should('be.eq', text));
      # menu.tolPage().should('be.eq', menu.curPage());
  });
}

【问题讨论】:

    标签: typescript cypress


    【解决方案1】:

    您应该阅读文档中处理 cypress 的 异步行为 的部分: https://docs.cypress.io/guides/core-concepts/introduction-to-cypress.html#Commands-Are-Asynchronous

    因此您不能将menu.curPage() 分配给变量并期望该变量包含文本。

    所以这将失败。当到达expect 行时,testVar 仍然为空:

    it("test", () =>{
        let testVar = null;
        cy.get("body").then(() => {
            testVar = 5;
        })
    
        expect(testVar).to.eq(5)
    })
    

    相反,您可以这样编写(取决于您要测试的内容和方式):

    it("test", () =>{
        let testVar = null;
        cy.get("body").then(() => {
            testVar = 5;
        })
    
        cy.get("body").should(() => {
            expect(testVar).to.eq(5)
        })
    })
    

    所以根据您的代码,您的解决方案可能类似于:

      describe('check two function should be eq') {
        const menu = new Menu();
          it('Verified "', () => {
            menu.curPage().then(cPText => {
                menu.tolPage().then(tPText => {
                    expect(cPText).to.eq(tPText);
                })
            });
        });
    

    如果您必须检查两个以上的文本值,这种命令嵌套可能会很烦人。为了让您的生活更轻松,您可以这样做:

    describe("test", () => {
        beforeEach(() => {
            cy.visit("https://cypress.io")
        })
    
        it("test", () => {
            getCaption();
            getSubCaption();
            // attention: function() syntax is required to keep `this` context
            cy.get("body").should(function() {
                expect(this.caption.indexOf("testing") > -1).to.eq(this.subcaption.indexOf("testing") > -1)
            });
        })
    })
    
    function getCaption() {
        return cy.get(".Hero-TagLine.mt-0").invoke("text").as("caption");
    }
    
    function getSubCaption() {
        return cy.get(".Hero-ByLine.mb-0").invoke("text").as("subcaption");    
    }
    

    我添加了一个自己的示例,因此我能够为您提供一个可运行且有效的示例。但是您可以轻松调整它以适应您的代码。 会发生什么:

    • cy.get().invoke("text").as("alias") 与您的代码中的相同,只是它将文本内容存储在别名中。 Cypress 还为每个别名创建一个新的实例变量,因此您可以通过this.caption 访问它。
      • 使用这种方法,您可以轻松存储 10 个或更多文本元素,然后在平面层次结构中访问它们
      • 但请注意function () 语法。您不能使用 phat 箭头语法,因为您的 this 上下文是错误的
      • 您还可以利用should 命令的重复功能。它将重试您的回调,直到没有断言失败或达到超时为止
      • 这也适用于 Typescript。当然,Typescript 不知道属性this.captionthis.subcaption。因此,您必须在之前将 this 转换为 any 或调整类型定义

    顺便说一句:我看到你这样做:cy.get().invoke("text").then(t => t.toString()) 是为了修复 TS 中的类型。您可以通过使用自己的类型定义来避免这种情况:

    declare global {
        namespace Cypress {
            interface Chainable {
                invoke(fn: "text"): Cypress.Chainable<string>;
            }
        }
    }
    

    https://github.com/cypress-io/cypress/issues/4022 合并后可以删除。

    【讨论】:

    • 这是典型的赛普拉斯回答人们询问获取和存储值的问题。它回答了问题之外的其他问题。假设您有一个 e2e 测试,想要检查多个页面上数据的持久性。 then() 中的断言和链接如何帮助解决这个问题?当您需要存储一个值时,然后稍后将该值与另一个页面上的值进行比较?这是端到端测试的一个重要点,似乎人们根本不理解它。如果您的所有测试都设置了数据并一次性完成所有断言,那么它就可以工作。但这还不够。
    • @Hfrav 我不确定我是否理解您的问题。您想在多个测试套件中保存值吗?在一个套件中,上述方法应该可以满足您的需求。如果没有,请给我一个伪代码的小例子,以便我更好地理解。
    • 没意义。我发现在 Cypress 中根本不可能执行以下操作:打开一个页面,从页面中获取一个值,将该值存储在一个变量中,打开一个新页面并将该页面上的元素与存储的值(元素从其他页面)。这只是赛普拉斯更像是“开发人员的单元测试工具”而不是成熟的 e2e 测试工具的另一个论点。为了解决这个问题,唯一的解决方案是拥有硬编码的测试数据,而每个对测试有所了解的人都知道这通常是不可取的。
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 2022-08-18
    • 2018-12-23
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多