我正在尝试使用赛普拉斯在OpenLayers地图上模拟ctrl +鼠标拖动。
我设法让 OpenLayers 注册点击/赛普拉斯事件(例如,点击创建功能(的唯一方法是使用.click()
例如
cy.get('#map').click(845, 710);
如果我使用.trigger()
和pointerdown
/mousedown
/dragstart
它要么静默失败,要么抛出错误。无论哪种方式,它都不起作用。
由于.click()
还会发出pointerdown
/pointerup
事件,所以我似乎无法使用它来模拟ctrl +鼠标拖动。
此外,要按 ctrl,我使用以下方法:cy.get('body').type('{ctrl}', {release: false})
- 这有效。
我不知道接下来该怎么尝试。我缺少.click()
的属性吗?或者这是OpenLayers或Cypress的潜在错误/问题?
编辑:我正在使用赛普拉斯4.8.0和OpenLayers 6.3.1
你有两种可能性:一,这是赛普拉斯中的一个错误,二,你处理事件错误。
Cypress的基本工作方式是通过浏览器内 API 运行事件,而不是模拟实际的键盘或鼠标操作(来源于 Cypress 员工(,因此您只能模拟浏览器侦听的单个事件。所以我看了一下赛普拉斯的做法,发现人们过去有过问题。您可以在该链接中尝试 Github 讨论末尾的代码段,我不确定这是否会使其起作用。
在本例中,您正在模拟 Event.ctrlKey 设置为 true 的单击事件。(或者至少:这就是你想要发生的。为了进一步调试,我将记录事件本身,并检查是否设置了 event.ctrlKey:
- 如果它是假的 - 你去吧,这是赛普拉斯中的一个错误。
- 如果这是真的,那么赛普拉斯工作正常,你只是以不寻常的方式监听ctrl/click事件,如果你切换到这样的东西,你会很好。
祝你好运,让我知道情况如何!
如果你有一个正确的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);
});
});
URLhttps://zikro.gr/dbg/so/62303304/dnd-with-cypress.html
中的页面已启动,它具有 DnD 功能,您可以使用上述代码并测试和检查控制台中也将检测Ctrl键的日志。它测试放置目标在事件模拟后是否具有子元素。当然,您可以执行任何其他测试来证明源已从A
下降到B
目的地。