Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Selenium waitFor机制的内部工作原理是什么?_Javascript_Extensibility_Internals_Selenium Ide - Fatal编程技术网

Javascript Selenium waitFor机制的内部工作原理是什么?

Javascript Selenium waitFor机制的内部工作原理是什么?,javascript,extensibility,internals,selenium-ide,Javascript,Extensibility,Internals,Selenium Ide,我试图通过拦截对doClick(locator)的调用来定制Selenium的click命令的行为(通过用户extensions.js)。基本上,每当我们的应用程序显示“忙碌指示器”时,我需要延迟单击操作 (现在这种情况的标准答案是在脚本中插入一个waitFor,用于这些情况。事实上,在我们的脚本中,我们目前有无数个waitFor。我正试图消除它们。) 检测页面元素是很简单的部分。棘手的部分是让脚本实际等待。我看起来很有希望,但失败的尝试如下所示: var nativeClick = Selen

我试图通过拦截对doClick(locator)的调用来定制Selenium的click命令的行为(通过用户extensions.js)。基本上,每当我们的应用程序显示“忙碌指示器”时,我需要延迟单击操作

(现在这种情况的标准答案是在脚本中插入一个waitFor,用于这些情况。事实上,在我们的脚本中,我们目前有无数个waitFor。我正试图消除它们。)

检测页面元素是很简单的部分。棘手的部分是让脚本实际等待。我看起来很有希望,但失败的尝试如下所示:

var nativeClick = Selenium.prototype.doClick;
Selenium.prototype.doClick = function(locator) {
  this.doWaitForCondition("!selenium.browserbot.findElementOrNull('busy-indicator')", 5000);
  return nativeClick.call(this, locator);
}
每次单击之前都会调用doWaitForCondition,但当条件的计算结果为false时,它会等待。nativeClick总是立即被调用,因此不会引入延迟。我怀疑doWaitForCondition函数本身并没有进行任何等待,而是在命令执行循环中为其建立条件。在本例中,click命令已经在使用中,我正在尝试在一个命令中运行一个命令


有人能解释一下Selenium命令执行和waitFor是如何工作的,或者提供一些建议吗?

好吧,看看java驱动程序
com.thoughtworks.Selenium.Wait
类就可以发现:

public void wait(字符串消息,长时间超时毫秒,长时间间隔毫秒){
长启动=System.currentTimeMillis();
长端=开始+超时毫秒;
while(System.currentTimeMillis()
我不想深入探讨硒元素,但我认为每个waitXXX方法都指向这一点


因此,Selenium正在使用
Thread.sleep()
。虽然这看起来可能不是一个理想的解决方案,但它至少表明,如果必要的话,您自己使用Thread.sleep()并不能让情况变得更糟。;-)

我终于解决了这个问题。这种方法比试图拦截各种形式的点击处理要好得多。我的改进目标是:在应用程序“繁忙”时延迟脚本命令的执行完成

Selenium命令处理的工作原理: 完成后,每个selenium命令返回一个
ActionResult
对象(请参阅
ActionHandler.prototype.execute
)。此对象上的
terminationCondition
属性是一个函数,用于确定selenium何时可以继续执行下一个命令(
TestLoop.prototype.continueTestWhenConditionTrue
)。基本上,selenium会重复执行条件函数,直到生成true。结果对象非常简单:

function ActionResult(terminationCondition) {
  this.terminationCondition = terminationCondition;
}
自定义它: 我想随时延迟执行
myAppIsBusy()
返回true。当然,所有的标准延迟也需要保持不变,比如等待页面加载和显式等待脚本中的条件。解决方案是在my user-extensions.js中重新定义selenium结果对象,如下所示:

function ActionResult(terminationCondition) {
  this.terminationCondition = function() {
    // a null terminationCondition means okay to continue
    return (!terminationCondition || terminationCondition()) && !myAppIsBusy();
  }
}
最棒的是,它的级别足够低,可以用于IDE和RC


请注意,这并不影响访问器或断言命令类型,它们返回不同的结果对象。但这应该没问题,因为这些命令不会影响应用程序的状态。

是的,这在java中非常有效,但在javascript中没有挂起执行线程的事情(因为只有一个线程)。我需要一个Selenium客户端解决方案。但是谢谢。你能详细说明一下myAppIsBusy()和Selenium是如何相互交谈的吗?我在中遇到了类似的问题,我正在尝试实现您的解决方案。myAppIsBusy()是我在user-extensions.js中定义的函数。当我希望selenium等待时,它返回true。例如,当我们的忙指示灯显示给我们的用户时。所以,假设我想检查一下忙指示灯。myAppBusy将类似于函数myAppIsBusy(){返回this.page().findElement('#wait');}。我正在创建另一个函数,比如Selenium.prototype.doWaitAjax()。在doWaitAjax()中我必须做什么?我是否要将其命名为.doverifylementispresent()?如何检查超时?mpAppIsBusy(或您选择调用函数的任何内容)应返回true或false。但是,是的,你基本上走在正确的轨道上。Selenium仍在进行常规超时检查。感谢所有的帮助,但我无法让它正常工作。无论我做什么,Selenium似乎都不会产生结果,因此浏览器在Selenium从用户扩展函数返回之前不会执行ajax成功调用。我可以稍后调用另一个函数,但这正是我试图避免的。如果你能提供一个小例子,也许在我链接的另一个问题中,我将永远感激;)