java - Selenium 的“sendKeys”方法是否首先对目标元素执行“点击”?
问题描述
我目前正在为将(并且正在)以不同技术(不同的 Web 框架、Java Swing [不是真的,但在技术上应该是可能的] 等)实现的小部件编写黄瓜测试。这些测试旨在通过直接模拟用户的输入来描述被测小部件的功能。例如,可以将测试表述为“用户打开网页 X,然后单击那里,然后单击那里,然后单击那里,现在我希望此文本字段包含值 Y”。
我目前在其中实施测试的技术是使用 Selenium 的网络。
现在,假设用户想要在文本字段中输入内容,用户实际上会做的是单击文本字段然后开始输入。就其本身而言,在键盘上键入与文本字段没有任何关系 - 只是因为单击将焦点切换到文本字段,文本字段才会接收键盘输入。
现在,Selenium 有一个sendKeys
方法。这个方法具体是做什么的?javadoc 声明“使用此方法模拟输入元素,这可能会设置其值”。
该sendKeys
方法是否像真实用户那样模拟单击(好像.click
首先被调用)然后是键盘输入?还是它设置焦点然后开始打字?或者它是否完全绕过焦点并简单地将“键盘输入”发送到输入元素?
由于单击某些小部件可能会表现出特殊行为,因此我需要知道 Selenium 是否在后台执行了单击,或者我是否必须手动调用它才能真实地模拟用户的行为。
注意:我没有按原样将黄瓜添加到标签中,尽管与上下文相关,但与实际问题无关
解决方案
请记住,元素可以通过单击以外的方式获得键盘焦点。例如,用户可以使用 tab 键来浏览表单的元素。
对于 Selenium 和 WebDriver,驱动程序为该sendKeys
方法所采取的步骤由W3C WebDriver Specification定义。为了在模拟按键输入之前将焦点设置到元素,该规范又链接到WHATWG HTML 规范。
聚焦独立于特定的“点击”动作发生。在实践中,给定的规范实现(chromedriver
、geckodriver
等)可能会通过单击元素来“运行聚焦步骤”。我不相信任何实现实际上都是这样的,但是您需要为各个实现验证这一点。
Tl;dr,不,sendKeys
不一定意味着 a click
。
推荐阅读
- amazon-web-services - 在 AWS Quicksight 中可视化 DynamoDB 数据
- mysql - 我如何检查我的 MARIADB 的 sintax 程序
- java - 当在 B 类的 func2 中使用 func1 中创建的对象调用时,如何引用调用 A 类的 func1 的对象?
- angular - AuthGuard 不显示组件
- sql - Laravel,从数据库中删除相关数据
- laravel - 如何测试外部 API?
- javascript - 如何用 X 替换句点?
- python - 使用 python itertools.groupby 解析文本数据块
- python - 为什么在测试数据上调用 transform() 会给出数据尚未拟合的错误?
- java - 来自父 POM 的 Maven PluginManagement 变量绑定