Selenium - проверьте, что объект определен перед его использованием - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь выполнить тестирование с использованием веб-драйвера селеном, и часть этого ждет, пока мой объект будет определен на странице. ПРИМЕЧАНИЕ : в DOM нет ничего, что появилось бы, когда мой объект доступен, и это не вариант, чтобы изменить это, поэтому, пожалуйста, не предлагайте это. Мне нужно проверить с помощью консоли.

Обычно после завершения загрузки страницы приходится ждать от 0 до 5 секунд, чтобы мой объект существовал, поэтому идея состоит в том, чтобы l oop 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 Ответ

0 голосов
/ 30 января 2020

Я получил структуру, подобную следующей:

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...