Javascript-如何编写一种等待一组事件之一发生的可重用方法?

时间:2019-01-22 17:59:46

标签: javascript selenium protractor

过去,我已经广泛地将Selenium与Java,Ruby和Groovy结合使用,以适应使用Protractor作为UI自动化框架。我是Java语言的新手,所以不确定我的一些旧技巧是否可以转让。

我在Ruby和Groovy中想到的最有用的东西之一是“ multiwait”库,它使我能够等待一组相互排斥的事件之一发生。给定一个映射,其中的键是事件的简单描述,值是可执行代码的块,该函数将简单地遍历每个可能的事件,并且当事件返回true时,函数将为该事件返回键。如果没有事件在给定的超时时间内返回true,则将引发一个Exception,概述事件及其等待的时间。还有一个特殊事件“什么都没有”,在这种情况下,如果数据有问题,某个动作可能会引发警告或错误事件,但如果数据良好,通常根本不会引起任何响应。如果“ nothing”是事件之一,那么该函数将返回“ nothing”事件的键,而不是在超时结束时引发Exception。

我现在正在尝试在Javascript中重新实现此方法,但是我对这种语言还很陌生,因此我不确定实现该方法的最佳方法。

所以我知道在Javascript中我可以将函数存储为变量。我是否应该将函数用作此哈希表中的事件值?他们会在范围方面带来任何问题,还是只要每个函数都能看到其使用的变量,一切都应该正常工作?

如果有人可以跟我讲一个简单的例子,那将非常有帮助。假设我有一个页面对象,其对象名为getColor,该方法从DOM中检索一些信息。在这种情况下,假设它将始终返回字符串red。我想在一个单独的文件中创建一个方法,该方法将接受事件的哈希表,如下所示:

var WaitForEvent = require('../../waitForEvent');
var wait = new WaitForEvent();

function getColor() {
  return 'red';
}

var outcomes = {};
outcomes['Data accepted'] = function () { getColor() == 'green' };
outcomes['Data rejected'] = function () { getColor() == 'red' };

var result = wait.waitFor(outcomes);

expect(result).toBe('Data accepted');

所以,这是我要如何为方法本身设置参数的粗略想法。这样的功能在这种情况下会起作用吗?是否可以使用waitForEvent函数遍历这些函数,测试每个函数以查看哪个首先返回了true,然后返回描述发生的事件的键?还是我需要以其他方式解决这个问题?

假设它可以工作,当我遍历哈希表本身就是无名函数的值时,该方法本身的外观如何?执行此类功能并检查其返回的正确方法是什么?

我要避免的一件事是Selenium中要避免的事情,那就是Selenium的ExpectedConditionsOR条件链接在一起。我宁愿比这更灵活。

谢谢!

1 个答案:

答案 0 :(得分:0)

假设您拥有(我正在将这些翻译为es6):

const getColor = () => 'red';
outcomes['Data rejected'] = () => getColor() === 'red';

现在您可以这样做:

let keys = Object.keys(outcomes).filter(k => outcomes[k]())

keys[0]将被“数据拒绝”(而不是未定义) 我不确定这是否能回答您的问题。要“等待”它,您需要将其放入带有一些setTimeouts的异步函数中。