了解Selenium中的执行异步脚本

了解Selenium中的执行异步脚本,第1张

了解Selenium中的执行异步脚本

这是对这两个API
的引用(这是Javadoc,但是功能相同),这是摘录,突出了两者的区别

[executeAsyncscript]在当前选定的框架或窗口的上下文中执行异步Javascript。与执行同步Javascript不同,使用此方法执行的脚本必须通过调用提供的回调来显式表示已完成脚本。此回调始终作为最后一个参数注入执行的函数中。

基本上,execSync会阻止硒浏览器正在执行的其他 *** 作,而execAsync不会阻止并在

callback
完成时调用a 。


由于您已经使用过量角器,因此我将以此为例。量角器用途

executeAsyncscript
get
waitForAngular

在中

waitForAngular
,量角器需要等到angular宣布所有事件解决为止。您不能使用它,
executescript
因为那需要在最后返回一个值(尽管我猜您可以实现一个忙循环,不断轮询角度直到完成)。它的工作方式是量角器提供一个回调,所有事件解决后,Angular会调用该回调,并且需要executeAsyncscript。在这里编码

在中

get
,量角器需要轮询页面,直到
window.angular
Angular设置了全局值为止。一种解决方法是
driver.wait(function(){driver.executescript('return window.angular')},5000)
,但是这种方式,量角器每隔几毫秒就会在浏览器上撞击一次。相反,我们这样做(简化):

functions.testForAngular = function(attempts, callback) {  var check = function(n) {    if (window.angular) {      callback('good');    } else if (n < 1) {      callback('timedout');    } else {      setTimeout(function() {check(n - 1);}, 1000);    }  };  check(attempts);};

再次,这是

executeAsyncscript
因为我们没有立即返回值。在这里编码


总而言之,

executeAsyncscript
当您关心调用脚本中的返回值时使用,但是该返回值将不会立即可用。如果您无法轮询结果,但必须使用回调或promise(必须将其转换为自己的回调)来获取结果,则这尤其必要。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4900209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存