过去,我已经广泛地将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的ExpectedConditions
与OR
条件链接在一起。我宁愿比这更灵活。
谢谢!
答案 0 :(得分:0)
假设您拥有(我正在将这些翻译为es6):
const getColor = () => 'red';
outcomes['Data rejected'] = () => getColor() === 'red';
现在您可以这样做:
let keys = Object.keys(outcomes).filter(k => outcomes[k]())
和keys[0]
将被“数据拒绝”(而不是未定义)
我不确定这是否能回答您的问题。要“等待”它,您需要将其放入带有一些setTimeouts
的异步函数中。