Javascript Selenium-在使用对象之前检查对象是否已定义
我正在尝试使用SeleniumWeb驱动程序执行测试,其中一部分是等待在页面上定义我的对象。 注意:当“我的对象”可用时,DOM中不会出现任何内容,并且不能更改,因此请不要建议这样做。我需要用控制台检查一下 通常在页面加载完成后,我必须在0-5秒之间的任何位置等待对象的存在,因此我的想法是循环Javascript Selenium-在使用对象之前检查对象是否已定义,javascript,selenium,execute-script,Javascript,Selenium,Execute Script,我正在尝试使用SeleniumWeb驱动程序执行测试,其中一部分是等待在页面上定义我的对象。 注意:当“我的对象”可用时,DOM中不会出现任何内容,并且不能更改,因此请不要建议这样做。我需要用控制台检查一下 通常在页面加载完成后,我必须在0-5秒之间的任何位置等待对象的存在,因此我的想法是循环window.myObject!==未定义的,直到它通过,在这一点上我确定我的对象存在,并且我可以调用myObject.myFunctionCall()。如果我不执行此等待,在页面完成加载后直接调用myOb
window.myObject!==未定义的
,直到它通过,在这一点上我确定我的对象存在,并且我可以调用myObject.myFunctionCall()
。如果我不执行此等待,在页面完成加载后直接调用myObject.myFunctionCall()
,我很可能会收到一个错误myObject未定义
当我在浏览器的控制台上执行这些步骤时,结果非常好:
let ret = false;
while (ret === false) {
ret = window.myObject !== undefined;
console.log(ret);
}
//now here ret has the value true. myObject is defined and I can continue with the test
myObject.myFunctionCall()
...
但是,我尝试使用selenium驱动程序(this.driver
)和以下代码执行此操作:
let ret = null;
while (ret === null) {
let val = this.driver.executeScript("window.myObject !== undefined;"); //returns promise
console.log(val);
ret = await val; //await promise resolution and assign value to ret
console.log(val);
console.log(ret);
//for some reason, ret is always null
}
这为我提供了以下打印输出,该输出会不断重复,直到测试在错误上失败:函数超时,确保承诺在30000毫秒内解决:
Promise { <pending> }
Promise { null }
null
Promise { <pending> }
Promise { null }
null
Promise { <pending> }
Promise { null }
null
...
Promise{}
承诺{null}
无效的
承诺{}
承诺{null}
无效的
承诺{}
承诺{null}
无效的
...
我错过了什么?有没有更好的方法来判断我的对象是否是使用selenium web驱动程序定义的?我最终得到了如下结构:
// Checks if myObject exists
const checkObjectDefined = () => window.myObject !== undefined;
let ObjectExists = false;
while (ObjectExists !== true) {
ObjectExists = await this.driver.executeScript(checkObjectDefined);
await this.driver.sleep(50);
}
//continue with test
需要注意的是,如果我将checkObjectDefined
定义移动到任何其他文件并导入它,它将失败,原因是InvalidArgumentError:invalid参数:“script”必须是字符串
看看这个:
我有一个文件helpers/myObject\u helper.js
,我想将定义放入其中,但以下操作失败,出现错误InvalidArgumentError:invalid参数:“script”必须是字符串
:
helpers/myObject_helper.js:
// Checks if myObject exists
const checkObjectDefined = () => window.myObject !== undefined;
testcases/myObject_testcase.js:
const ObjectHelper = require('helpers/myObject_helper.js');
let ObjectExists = false;
while (ObjectExists !== true) {
ObjectExists = await this.driver.executeScript(ObjectHelper.checkObjectDefined);
await this.driver.sleep(50);
}