Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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-在使用对象之前检查对象是否已定义_Javascript_Selenium_Execute Script - Fatal编程技术网

Javascript Selenium-在使用对象之前检查对象是否已定义

Javascript Selenium-在使用对象之前检查对象是否已定义,javascript,selenium,execute-script,Javascript,Selenium,Execute Script,我正在尝试使用SeleniumWeb驱动程序执行测试,其中一部分是等待在页面上定义我的对象。 注意:当“我的对象”可用时,DOM中不会出现任何内容,并且不能更改,因此请不要建议这样做。我需要用控制台检查一下 通常在页面加载完成后,我必须在0-5秒之间的任何位置等待对象的存在,因此我的想法是循环window.myObject!==未定义的,直到它通过,在这一点上我确定我的对象存在,并且我可以调用myObject.myFunctionCall()。如果我不执行此等待,在页面完成加载后直接调用myOb

我正在尝试使用SeleniumWeb驱动程序执行测试,其中一部分是等待在页面上定义我的对象。 注意:当“我的对象”可用时,DOM中不会出现任何内容,并且不能更改,因此请不要建议这样做。我需要用控制台检查一下

通常在页面加载完成后,我必须在0-5秒之间的任何位置等待对象的存在,因此我的想法是循环
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);
}