注意:我们称“点击”是最终用户点击。'js click' 是通过 JS 点击
为什么在常规 WebDriver 单击不起作用时单击“通过 JavaScript”起作用?
有两种情况会发生这种情况:
一、如果你使用的是 PhamtomJS
那么这是最常见的已知行为PhantomJS
。某些元素有时不可点击,例如<div>
。这是因为PhantomJS
最初是为模拟浏览器引擎而制作的(如初始 HTML + CSS -> 计算 CSS -> 渲染)。但这并不意味着以最终用户的方式进行交互(查看、单击、拖动)。因此PhamtomJS
,最终用户交互仅部分支持。
为什么 JS 单击有效?至于任何一种点击,它们都是平均点击。它就像一把带有1 个枪管和2 个扳机的枪。一个来自视口,一个来自 JS。由于PhamtomJS
在模拟浏览器引擎方面很棒,因此 JS 单击应该可以完美工作。
二、“click”的事件处理程序必须在糟糕的时间段内绑定。
例如,我们得到了一个 <div>
我们可能会得到相同的结果。单击将不起作用,因为 WebdriverJS 在没有单击事件处理程序时尝试单击该元素。
为什么 JS 单击有效?js点击就像是直接在浏览器中注入js一样。可能有 2 种方式,
Fist是通过 devtools 控制台(是的,WebdriverJS 确实与 devtools 的控制台通信)。
其次是将<script>
标签直接注入 HTML。
对于每个浏览器,行为会有所不同。但无论如何,这些方法比单击按钮更复杂。点击正在使用已经存在的内容(最终用户点击),js点击正在通过后门。
而对于 js 来说,点击似乎是一个异步任务。这与'浏览器异步任务和CPU任务调度'这个有点复杂的话题有关(看了一会儿又找不到文章了)。简而言之,这主要是因为js单击需要等待CPU的一个任务调度周期,并且在单击事件绑定后运行速度会慢一些。
(当您发现元素有时可点击,有时不可点击时,您可能知道这种情况。)
这究竟是什么时候发生的,这种解决方法的缺点是什么(如果有的话)?
=> 如上所述,两者都意味着一个目的,但关于使用哪个入口:
- 单击:使用浏览器默认提供的内容。
- JS点击:正在走后门。
=> 对于性能,很难说,因为它依赖于浏览器。但一般来说:
- 单击:并不意味着更快,而只是在 CPU 执行任务的调度列表中标记了更高的位置。
- JS click: 不代表慢,只是签到了CPU任务调度列表的最后一个位置。
=> 缺点:
- Click: 除了您使用的是 PhamtomJS 之外,似乎没有任何缺点。
- JS点击:对健康非常不利。您可能会不小心单击视图中不存在的内容。当您使用它时,请确保该元素在那里并且可以作为最终用户的观点进行查看和单击。
PS,如果您正在寻找解决方案。
- 使用 PhantomJS?我会建议使用 Chrome 无头代替。是的,您可以在 Ubuntu 上设置 Chrome 无头。Thing 像 Chrome 一样运行,但它没有像 PhantomJS 那样的视图和更少的错误。
- 不使用 PhamtomJS 但仍有问题?我会建议将量角器的 ExpectedCondition 与
browser.wait()
(查看此信息以获取更多信息)
(我想把它缩短,但结果很糟糕。任何与理论相关的东西都很难解释......)