Селен - проверьте, что объект определен, прежде чем использовать его

Я пытаюсь выполнить тестирование с помощью веб-драйвера selenium, и часть этого ожидает, пока мой объект будет определен на странице.ПРИМЕЧАНИЕ: в 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()
...

Но затем я пытаюсь сделать это с помощью драйвера селена (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?

1 ответ

В итоге я получил такую ​​структуру:

// 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;

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);
}
Другие вопросы по тегам