单击超链接时能够防止/停止在赛普拉斯中加载“页面加载”

在我的赛普拉斯测试中,我需要测试一个链接,单击时下载一个 ​​.txt、.xlsx 和一个 .zip 文件,但是当我使用“click()”单击超链接时,它会启动页面加载并期望由于单击链接而发生新的操作。

Here is a screenshot of the issue described above

作为替代方案,我尝试使用 cy.downloadFile() 直接通过链接下载文件,但我使用的链接是动态生成的,因此我也无法使用它。因此,我想将新生成的链接存储在变量中,然后在每次运行测试时在 cy.downloadFile() 中使用它。

是否有任何其他方法可以测试超链接或如何在每次运行测试时存储动态生成的链接?

stack overflow Ability to prevent/stop loading 'Page load' in Cypress when clicked a hyperlink
原文答案
author avatar

接受的答案

我找到了一种方法来存储我要单击的元素的链接。由于我能够存储链接,因此我可以使用 cy.downloadFile() 来解决要求。

cy.get('@selector', {timeout: 15000}).then(($input) => {
            cy.downloadFile($input.attr('href'),'cypress/downloads','filename.csv')
        });

答案:

作者头像

嗨,我以前遇到过这个问题。

我认为这与赛普拉斯测试运行程序只是保持等待页面加载事件而不在文件成功下载时转到下一个测试命令的情况相同。

添加自定义 cy.window 事件以侦听单击事件并添加超时以“强制”重新加载当前页面,您需要调整超时值以使其适合您的测试。

    it.only('tes button download', ()=> {
        // visit url
        cy.visit("/spmb/list_nilaiseleksi");
        cy.get('#wrap-button > .btn').click()

        //download
        cy.window().document().then(function (doc) {
            doc.addEventListener('click', () => {
              setTimeout(function () { doc.location.reload() }, 5000)
            })
            cy.get(':nth-child(9) > .col-md-12 > .btn').click()
        })

    })

更多细节和讨论可在 cypress github 问题上找到: https://github.com/cypress-io/cypress/issues/14857

作者头像

对我来说,在我将 download 属性添加到链接后,问题就解决了,这改变了 DOM 中的元素,但它使解决方案保持简单:

        cy.get('[href="download?type=php"]')
            .then((el) => {
                el.attr('download', '');
            })
            .click();