сохранить сессию после входа в систему - селен - javascript - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь автоматизировать пару страниц с помощью веб-драйвера selenium и узла js. Мне удалось войти, но после входа я хочу использовать тот же сеанс, инициированный веб-драйвером, чтобы я мог провести автоматическое тестирование на странице, защищенной сессией. Это моя попытка

async function login(){
    Let  d =  await new Builder()
                        .forBrowser('chrome')
                        .build();
    await d.get('https://demo.textdomain.com/')
    await d.findElement(By.id('username')).sendKeys('admin ')
    await d.findElement(By.id('password')).sendKeys('admin');
    await d.findElement(By.css('button[type="submit"]')).click();
    await d.getPageSource().then(function(content) {

            if(content.indexOf('Welcome text') !==-1 ) {
             console.log('Test passed');
             console.log('landing page');
             d.get('https://demo.textdomain.com/landingpage') //this is still going to login page as i cannot use the previous session 
            } else {
                console.log('Test failed');
                return false;
            }
            //driver.quit();
        });

}

login();

Я случайно сбрасываю браузер после входа в систему.

Ответы [ 4 ]

0 голосов
/ 17 ноября 2018

Возможно, вы просто имеете дело с проблемами времени. Селен движется очень быстро . Намного быстрее, чем вы можете взаимодействовать как пользователь. Так что это часто действует непредсказуемым образом. Но это только потому, что Selenium работает намного быстрее, чем вы, как пользователь. Чтобы обойти это, вы должны хорошо использовать встроенную в Selenium driver.wait. Например:

const button = driver.wait(
  until.elementLocated(By.id('my-button')), 
  20000
);

button.click();

Вышеуказанное ожидает, пока кнопка с идентификатором my-button присутствует в DOM, и затем щелкает ее. Он будет ожидать максимум 20000 миллисекунд, но завершится, как только кнопка станет доступной.

Так что в вашем случае, если что-то станет доступным после успешного входа пользователя, вы можете подождать этот элемент, прежде чем перейти на новую страницу в вашем коде.

Кстати, я тоже не совсем уверен, почему вы используете getPageSource()? Это кажется очень сложным способом получить то, что вы ищете. Разве это не содержимое внутри элемента, из которого вы можете получить содержимое?

Я написал статью о Как писать надежные браузерные тесты с использованием Selenium и Node.js , которые могут помочь вам более подробно понять приведенный выше пример кода из этой статьи, а также другие методы, которые вы можете использовать для надежно дождитесь различных условий в браузере.

0 голосов
/ 14 ноября 2018

Я полагаю, что ваша проблема неправильно ожидает входа в систему.

Selenium не ждет выполнения асинхронных действий, он перемещается на следующую строку, поэтому, когда вы запрашиваете источник страницы, есть большая вероятность, что действие входа не выполнено на сервере, и результат не то, что вы ожидаете.

Вы должны явно указать Selenium ждать, поэтому вам нужно добавить некоторый код между логином и кодом, который проверяет, является ли пользователь логином, ради этого предположения добавьте тайм-аут на 10 секунд.

если это работает для вас, вы не хотите просто тратить время, поэтому вам нужно подождать, пока определенные элементы на странице изменятся из-за имени входа, например, вам нужно дождаться присутствия (или видимости) если он уже есть в DOM) пользовательской фотографии в шапке.

также я не уверен, как ведет себя функция «getPageSource», она может использовать существующую страницу или может запросить новую копию.

Я бы посоветовал вам использовать другие способы проверки входа пользователя в систему путем проверки DOM.

0 голосов
/ 14 ноября 2018

Я предлагаю повторно использовать cookie-файл сессии после первого входа в другие экземпляры веб-драйвера.

Сначала сохраните куки:

var cookieValue = firstWebDriver.Manage().Cookies.GetCookieNamed(name:"cookie_name");

Затем вы можете передать его любому экземпляру WebDriver, настроить его и запустить веб-приложение, как если бы это был один и тот же пользователь с разными экземплярами браузера:

anotherWebDriver.Manage().Cookies.AddCookie(new Cookie(name:"cookie_name", value:cookieValue));

Если вы хотите использовать один и тот же экземпляр браузера, вы должны синхронизировать его, потому что вызовы WebDriver, как правило, не являются поточно-ориентированными и часто приводят к исключениям (например, устаревший из-за изменения элемента или notfound , поскольку один веб-драйвер перешел на другую страницу).

Тогда я предлагаю просто использовать дескриптор окна для следующего экземпляра, не заботясь о сеансе. Первый открывается, а последний закрывает сеанс (считайте ссылочные дескрипторы) и убедитесь, что только один драйвер использует этот дескриптор одновременно. Вы также можете создавать новые окна браузера, и это сохранит сеанс и даст вам новый дескриптор:

var handle = firstWebDriver.CurrentWindowHandle;
otherWebDriver.SwitchTo().Window(handle);

Я написал код на C #, но его легко адаптировать к JavaScript.

0 голосов
/ 12 ноября 2018

Из аналогичного вопроса на SQA StackExchange вы можете сохранить и восстановить файлы cookie текущего сеанса:

Использование Javascript:

// Storing cookies:
driver.manage().getCookies().then(function (cookies) {
    allCookies = cookies;
}); 

// Restoring cookies:
for (var key in allCookies) {
    driver.manage().addCookie(key, allCookies[key]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...