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