如何使用 webdriver.io 模拟 ctrl-click 或 shift-click?

Posted

技术标签:

【中文标题】如何使用 webdriver.io 模拟 ctrl-click 或 shift-click?【英文标题】:How to simulate ctrl-click or shift-click with webdriver.io? 【发布时间】:2015-07-16 15:28:30 【问题描述】:

对于 webdriver.io,我想使用 shiftctrl 等修饰符来模拟点击。 keys() 方法似乎做了类似的事情,但我不清楚如何再次释放修饰键,当我使用 16shift 的键码)作为该方法的参数 - link.

背景:在我测试的网页中,我有一个与文件浏览器中的文件和文件夹相当的元素列表,并且可以使用 shift 选择多个元素ctrl。这很好用,现在我想用 webdriver.io 测试它。为此,webdriver.io 例如必须单击一个元素,然后按 shift,然后单击另一个元素,最后释放 shift 按钮。 有什么办法吗?

【问题讨论】:

client.keys('Shift').buttonPress(); ? buttonPress() (或 buttonDown()buttonUp() )遗憾的是用于鼠标而不是修饰键。 但是“修饰键”是什么意思?我明天试试:) 我想模拟ctrl-click。所以我想应该有类似 ctrl_key_down==>click==>ctrl_key_up. 编辑了我的答案以包括ctrl 单击以及如何释放修饰键。 (应该通过超出client.elements 的范围来释放修饰键,但也可以通过发送client.keys('NULL') 显式释放) 【参考方案1】:

编辑:如果您想使用ctrl 键选择不同的元素:

client.elements(<css selector for your list of elements>, function(err, res) 
    client
         .moveTo(res.value[<index of element you want to select>].ELEMENT, 0, 0)
         .keys('Ctrl') #every action after this within the scope of `client.elements` will have the `ctrl` key depressed
         .buttonPress('left')
         .moveTo(res.value[<index of element you want to select>].ELEMENT, 0, 0)
         .buttonPress('left')
         .moveTo(res.value[<index of element you want to select>].ELEMENT, 0, 0)
         .buttonPress('left')
         #repeat `.moveTo` and `.buttonPress` for every element you want to `ctrl` select
         .keys('NULL'); #This command or `.keys('Shift') will release the `shift` key.
);

要使用shift 键进行选择,请使用下面的代码(假设您要选择元素列表中的每个项目——显然您可以更改索引以获取元素列表的特定子部分)。它将移动到元素列表中第一个元素的左上角,然后左键单击,然后按 shift 键,然后移动到最后一个元素的左上角,再次单击左键,然后释放 shift 键:

client.elements(<css selector for your list of elements>, function(err, res) 
    client
         .moveTo(res.value[0].ELEMENT, 0, 0)
         .buttonPress('left')
         .keys('Shift')
         .moveTo(res.value[(res.value.length-1)].ELEMENT, 0, 0)
         .buttonPress('left')
         .keys('NULL'); #This command or `.keys('Shift') will release the `shift` key.
);

【讨论】:

谢谢!这解决了问题。对我来说,再次调用 keys('Shift') 可以释放 shift 键。 @Sandro 没问题!只是好奇 - 调用 keys('NULL') 是否也会为您释放它,还是只有在您调用 keys('Shift') 时才会释放它? 我试过了,keys('NULL') 也释放了密钥。你能解释一下为什么会这样吗?或者在某处有解释吗? 另外keys() 基本上是在client 上调用的。这就是为什么我认为它在client 对象的范围内。为什么keys()实际上在elements()的范围内?你有什么方便的读物可以推荐吗? @Sandro keys('NULL') 释放所有密钥。不幸的是,它不在文档中,但如果您转到unicodeChars.js,您将看到它是您可以传入的选项之一,它会将修饰键更改为 null 的 unicode 字符。至于范围,我可能错了,我之前做过类似的事情,但没有测试过这个确切的代码。你能在client.elements之外测试它是否为你发布吗?

以上是关于如何使用 webdriver.io 模拟 ctrl-click 或 shift-click?的主要内容,如果未能解决你的问题,请参考以下文章

Selenium & webdriver.io 如何使用 executeScript?

Webdriver.io - 如何在配置中使用 beforeEach 钩子

如何使用 webdriver.io 控制 Android 设备

如何使用没有标识符的 WebDriver.io 在页面上查找元素

如何在 webdriver.io 中以 32 位模式启动 IE

如何等待 WEBdriver.io 的 Ajax 调用完成