4

我正在尝试使用 Cypress 在 OpenLayers 地图上模拟 ctrl + 鼠标拖动。

我设法让 OpenLayers 注册单击/赛普拉斯事件(例如,单击以创建功能)的唯一方法是使用.click() 例如

cy.get('#map').click(845, 710);

如果我使用.trigger()and pointerdown/ mousedown/dragstart它要么静默失败,要么抛出错误。无论哪种方式,它都行不通。

因为.click()也会发出pointerdown/pointerup事件,所以我似乎无法使用它来模拟 ctrl + 鼠标拖动。

此外,要按 ctrl,我使用以下命令:cy.get('body').type('{ctrl}', {release: false})- 这有效。

我不知道下一步该尝试什么。有没有.click()我失踪的财产?或者这是 OpenLayers 或 Cypress 的潜在错误/问题?

编辑:我正在使用 Cypress 4.8.0 和 OpenLayers 6.3.1

4

2 回答 2

0

您有两种可能性:一,这是赛普拉斯中的一个错误,或者二,您处理错误的事件。

赛普拉斯工作的基本方式是通过浏览器内的 API 运行事件,而不是模拟实际的键盘或鼠标操作(来自赛普拉斯员工),因此您只能模拟浏览器侦听的单个事件。所以我看了一下赛普拉斯的做法,发现人们过去曾遇到过问题。您可以在该链接中的 Github 讨论末尾尝试该片段,我不确定这是否会起作用。

在这种情况下,您正在模拟一个将Event.ctrlKey设置为 true 的 Click 事件。(或者至少:这就是你想要发生的事情。)为了进一步调试,我会记录事件本身,并检查是否设置了 event.ctrlKey:

  • 如果它是假的 - 你去了,这是赛普拉斯的一个错误。
  • 如果这是真的,那么赛普拉斯工作正常,你只是在以不寻常的方式收听 ctrl/click 事件,如果你切换到这样的东西,会很好。

祝你好运,让我知道进展如何!

于 2020-06-18T19:09:12.240 回答
0

如果您有正确的DnD源和目标元素设置,则trigger可以:

describe('DnD simulation test', () => {
  it('finds the content "type"', () => {
    cy.visit('https://zikro.gr/dbg/so/62303304/dnd-with-cypress.html');

    // #dz-a -> Dropzone A, which the #drag is inside when page loads
    // #dz-b -> Dropzone B, which the #drag element will be inside after DnD simulation

    cy.get('#drag').trigger('dragstart', { ctrlKey: true });
    cy.get('#dz-b').trigger('drop', { ctrlKey: true });
    cy.get('#drag').trigger('dragend', { ctrlKey: true });

    // We just test if the destination element has 1 child after the DnD simulation.
    // When the page loads it has no children at all, but after DnD simlation it has exactly 1 element
    cy.get('#dz-b').children().should('have.length', 1);
  });
});

URL 中的页面https://zikro.gr/dbg/so/62303304/dnd-with-cypress.html已启动,并且它具有 DnD 功能,您可以使用上述代码并测试并检查控制台以获取也将检测Ctrl密钥的日志。它在事件模拟之后测试放置目标目标是否具有子元素。当然,您可以执行任何其他测试来证明源已从A目的地B下降。

于 2020-06-22T16:08:21.387 回答