首页 > 解决方案 > Selenium 的“sendKeys”方法是否首先对目标元素执行“点击”?

问题描述

我目前正在为将(并且正在)以不同技术(不同的 Web 框架、Java Swing [不是真的,但在技术上应该是可能的] 等)实现的小部件编写黄瓜测试。这些测试旨在通过​​直接模拟用户的输入来描述被测小部件的功能。例如,可以将测试表述为“用户打开网页 X,然后单击那里,然后单击那里,然后单击那里,现在我希望此文本字段包含值 Y”。

我目前在其中实施测试的技术是使用 Selenium 的网络。

现在,假设用户想要在文本字段中输入内容,用户实际上会做的是单击文本字段然后开始输入。就其本身而言,在键盘上键入与文本字段没有任何关系 - 只是因为单击将焦点切换到文本字段,文本字段才会接收键盘输入。

现在,Selenium 有一个sendKeys方法。这个方法具体是做什么的?javadoc 声明“使用此方法模拟输入元素,这可能会设置其值”。

sendKeys方法是否像真实用户那样模拟单击(好像.click首先被调用)然后是键盘输入?还是它设置焦点然后开始打字?或者它是否完全绕过焦点并简单地将“键盘输入”发送到输入元素?

由于单击某些小部件可能会表现出特殊行为,因此我需要知道 Selenium 是否在后台执行了单击,或者我是否必须手动调用它才能真实地模拟用户的行为。

注意:我没有按原样将黄瓜添加到标签中,尽管与上下文相关,但与实际问题无关

标签: javaseleniumselenium-webdriverkeyboardfocus

解决方案


请记住,元素可以通过单击以外的方式获得键盘焦点。例如,用户可以使用 tab 键来浏览表单的元素。

对于 Selenium 和 WebDriver,驱动程序为该sendKeys方法所采取的步骤由W3C WebDriver Specification定义。为了在模拟按键输入之前将焦点设置到元素,该规范又链接到WHATWG HTML 规范

聚焦独立于特定的“点击”动作发生。在实践中,给定的规范实现(chromedrivergeckodriver等)可能会通过单击元素来“运行聚焦步骤”。我不相信任何实现实际上都是这样的,但是您需要为各个实现验证这一点。

Tl;dr,不,sendKeys不一定意味着 a click


推荐阅读