我是 Cypress 的新手。我的应用程序作为“路由系统”手动更改 window.location.hash
在某些时候,我单击了一个更改哈希的按钮,因此应该在测试期间更改页面。我可以看到在执行过程中出现一个“新网址”条目,但是如何让柏树访问该网址?

javascript - 访问新网址 Cypress-LMLPHP

简而言之,问题是: 你可以看到我输入密码,然后 {enter} 。运行测试我可以看到地址栏中的散列更改,但页面不会根据散列更改而更改。

这是测试代码

context("Workflow", () => {

    it("login", () => {

        cy.visit("http://localhost:3000/src/#login")
        cy.get("#username").type("demo").should("have.value", "demouser")
        cy.get("#password").type("demo{enter}").should("have.value", "demo") // this should redirect to "/#home"
        //cy.wait(10000)
        cy.get(".subtitle").should("have.value", "Welcome") //this line fails as ".subtitle" is an element of "/#home"
    })
})

编辑: 经过无数次失败的尝试,我想出了一个部分有效、笨拙且笨拙的解决方案。我认为我不需要使用 reload() 来解决这个问题(必须有更好的解决方案..),但要使其工作,我必须等待所有远程请求完成(否则 reload() 会取消它们)。我说部分工作是因为如果我先尝试访问 #login ,然后按照 #home 中的重定向,然后将页面更改为 #browser ,您可以从代码中的注释中看到,最后一个不起作用(我可以看到哈希值发生变化#browser ,但页面仍然是 #home )。
import 'cypress-wait-until';

let i = 0;

context("Workflow", () => {
    it("login", () => {
        cy.server( {
            onRequest: () => {
                i++;
            },
            onResponse: () => {
                i--;
            }
        });

        cy.visit("http://localhost:3000/src/#login")
        cy.get("#username").type("demouser").should("have.value", "demouser")
        cy.get("#password").type("demouser").should("have.value", "demouser")
        cy.get("form#formLogin").submit()

        cy.waitUntil(() => i > 0)
        cy.waitUntil(() => i === 0)
        cy.reload(); // it correctly change the hash AND the page to #home!

        cy.url().should("include", "#home")
        cy.get(".version").contains( "v2.0.0-beta") // it works!!

        cy.get("a[data-id=browser]").click({force: true}) // it correctly changes the hash to #browser
        cy.waitUntil(() => i > 0)
        cy.waitUntil(() => i === 0)
        cy.reload();

        // the hash in the address bar is #browser, but the web page is #home
    })
})

最佳答案

Cypress 有一个名为 url:changed 的事件。请参阅有关 事件的文档 here

使用这个,这样的事情可能会起作用:

context("Workflow", () => {
    it("login", () => {

        cy.on('url:changed', url => {
            cy.location('hash').then(hash => {
                if (!url.endsWith(hash)) {
                    cy.visit(url);
                }
            });
        });

        cy.visit("http://localhost:3000/src/#login")
        cy.get("#username").type("demo").should("have.value", "demouser")
        cy.get("#password").type("demo{enter}").should("have.value", "demo") // this should redirect to "/#home"
        cy.get(".subtitle").should("have.value", "Welcome") //this line fails as ".subtitle" is an element of "/#home"

    })
})

编辑:仅出于故障排除目的并专注于您的问题,您可以在没有 cy.location() 的情况下尝试这样的操作:
context("Workflow", () => {
    it("login", () => {

        cy.on('url:changed', url => {
            cy.visit(url);
        });

        cy.visit("http://localhost:3000/src/#login")
        cy.get("#username").type("demo").should("have.value", "demouser")
        cy.get("#password").type("demo{enter}").should("have.value", "demo") // this should redirect to "/#home"
        cy.get(".subtitle").should("have.value", "Welcome") //this line fails as ".subtitle" is an element of "/#home"

    })
})

编辑:你试过 cy.reload()
context("Workflow", () => {

    it("login", () => {

        cy.visit("http://localhost:3000/src/#login")
        cy.get("#username").type("demo").should("have.value", "demouser")
        cy.get("#password").type("demo{enter}").should("have.value", "demo") // this should redirect to "/#home"
        cy.reload();
        cy.get(".subtitle").should("have.value", "Welcome");
    })
})

关于javascript - 访问新网址 Cypress,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61531828/

10-12 00:08