0

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

通常在页面加载完成后,我必须等待 0-5 秒之间的任何时间让我的对象存在,所以想法是循环window.myObject !== undefined直到它通过,此时我确定我的对象存在并且我可以调用myObject.myFunctionCall(). 如果我不执行此等待并myObject.myFunctionCall()在页面加载完成后直接调用,我很有可能会收到myObject is not defined.

当我从浏览器的控制台执行这些步骤时,结果非常好:

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
}

它为我提供了以下打印输出,该打印输出不断重复,直到测试失败Error: function timed out, ensure the promise resolves within 30000 milliseconds

Promise { <pending> }
Promise { null }
null
Promise { <pending> }
Promise { null }
null
Promise { <pending> }
Promise { null }
null
...

我在这里想念什么?有没有更好的方法来判断我的对象是否是使用 selenium web 驱动程序定义的?

4

1 回答 1

0

我最终得到了如下结构:

// 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 argument: 'script' must be a string

看一下这个:

我有一个helpers/myObject_helper.js要放入定义的文件,但以下失败并出现错误InvalidArgumentError: invalid argument: 'script' must be a string

助手/myObject_helper.js:

// Checks if myObject exists
const checkObjectDefined = () => window.myObject !== undefined;

测试用例/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);
}
于 2020-01-29T21:38:23.753 回答