Селен - проверьте, что объект определен, прежде чем использовать его
Я пытаюсь выполнить тестирование с помощью веб-драйвера 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);
}