在Chrome中运行时如何使用赛普拉斯测试文件下载

时间:2019-04-24 10:09:49

标签: javascript google-chrome testing download cypress

我进行了以下测试,需要验证单击链接是否可以下载PDF。这一点特别重要,因为我们正在使用Gatsby,而Gatsby又使用了到达路由器的链接组件,而且配置错误相对容易,以便路由器接管链接并导航到404页面而不是启动下载。

template <typename Policy,
          typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type >
struct Foo;

template <typename Policy>
struct Foo<Policy> {  // <Policy> added!
    Foo();
};

template <typename Policy>
Foo<Policy>::Foo() {
}

虽然这不是完美的方法,但它至少会检查是否由于单击链接而没有导航。

问题在于,当使用describe.skip(`Downloads`, () => { it(`Downloads the expected file`, () => { cy.visit(pagePath) cy.getByHref(downloadPath) .should(`have.attr`, `target`, `_blank`) .click() cy.location(`pathname`).should(`eq`, pagePath) }) }) (在Chrome中运行测试)运行此测试时,由于Chrome的下载对话框,该测试将挂起。

如何防止测试挂起?

请注意,downloadPath解析为静态目录中的pdf,例如cy run。没有服务器组件。

还请注意,这是另一个问题:How can I use Cypress.io to assert that a file download has been initiated without actually downloading?

3 个答案:

答案 0 :(得分:0)

有很多测试方法,因此要视情况而定。您需要了解真正导致下载的原因,然后考虑一种测试该机制的方法。

如果您的服务器发送了导致浏览器提示下载的特定处置标头,则可以找出此请求的URL,然后使用cy.request()直接命中该URL。然后,您可以测试服务器是否发送了正确的响应头。

如果它是启动下载的锚点,则可以测试它是否具有正确的href属性。只要您可以确认单击该按钮将发出正确的HTTP请求,就没有其他要测试的内容了。

最后,取决于您自己的实现方式并进行足够的测试以涵盖所有内容。

答案 1 :(得分:-1)

实际上,我对此进行了很多搜索,发现 安装了浏览器扩展的无头模式无法运行测试,因为在无头模式下唯一受支持的浏览器是Electron,而Electron不支持文档中所述的扩展。

尚不支持运行无头Chrome。看到这个问题:#488 https://github.com/cypress-io/cypress/issues/488

这是一个不那么古老的问题,它已在2019年2月被标记

https://github.com/cypress-io/cypress/issues/832 https://github.com/cypress-io/cypress/issues/1235

答案 2 :(得分:-1)

您可以通过禁用询问文件保存位置的对话框来防止测试挂起。完成该操作后,Chrome会愉快地下载文件,赛普拉斯可以继续运行测试。

在chrome中,转到设置->高级->下载->在下载前询问每个文件的保存位置,并确保文件已关闭。

Apolo提供的链接中有更复杂的解决方案,但这是一个快速的解决方法。