Selenium & Node.js: динамическое переключение на созданную вкладку - PullRequest
0 голосов
/ 29 октября 2019

В случае 1 вкладки самая новая вкладка всегда будет последней вкладкой. То же самое относится и к последней вкладке, которая используется для открытия новой вкладки. Следующий код переключится на последнюю вкладку.

EDIT : Благодаря @JimEvansВ большинстве ответов по SO вы найдете жестко закодированные индексы для окон. Как показано ниже:

return await driver.wait(async function () {
    return await driver.getAllWindowHandles().then(async function (handles) {
       // var isHandleCount2 = (handles.length == 2);
        if (handles.length > 1) {
            return driver.switchTo().window(handles[handles.length - 1]);
        }
        return false;
    });
}).then(function () {
    // Now do some stuff in new tab

});

Как насчет случая, когда у нас есть 5 вкладок, и активная вкладка 3 открывает новую вкладку, и новая вкладка запускается между вкладкой 3 и вкладкой 4.

Какполучаем ли мы индекс вновь созданной вкладки динамически, без жесткого кодирования ее индекса, как в большинстве примеров на SO?

1 Ответ

0 голосов
/ 29 октября 2019

Да, люди все время делают вещи, которые они не понимают полностью, и не понимают, что код не всегда работает так, как они ожидают.

Как указал Джим, порядок окнадескрипторы (вкладки) в возвращаемом массиве из .getAllWindowHandles() не гарантируются. Вы можете вызвать .getAllWindowHandles(), сохранить этот список как before, создать новую вкладку, снова вызвать .getAllWindowHandles() и сохранить этот новый список как after, а затем сравнить два и найти дескриптор в новом списке, который нене существует в старом списке ... это дескриптор вашей недавно созданной вкладки.

Я не делаю JS, но вы можете использовать функцию .filter() для этого сравнения.

function array_diff(a, b) {
    return a.filter(function(value) {
        return (b.indexOf(value) === -1);
    });
}

console.log(array_diff(["a", "b", "c"], ["a", "b"]));

Это возвращает ["c"].

Я могу представить, что вы делаете что-то вроде

before = driver.getAllWindowHandles();
// do something that creates a new window/tab
// might need to wait for the new window to be created
after = driver.getAllWindowHandles();
handle = array_diff(after, before);
driver.switchTo().window(handle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...