#google-chrome #protractor #headless
#google-chrome #транспортир #без головы
Вопрос:
Ошибка: перехваченный щелчок по элементу появляется только в безголовом Chrome, он отлично работает, если я запускаю его в браузере Chrome без безголового.
Я уже пробовал приведенные ниже решения:
- Увеличение размера окна в настройках конфигурации Chrome до
'chromeOptions': { args: [ "headless","--disable-gpu", "--window-size=1920,1080" ] }
- browser.actions().mouseMove(элемент).click(); и browser.actions().mouseMove(элемент).click().perform();
- Установите размер окна в методе onprepare():
// set screen size setTimeout(function() { browser.driver.executeScript(function() { return { width: window.screen.availWidth, height: window.screen.availHeight }; }).then(function(result) { browser.driver.manage().window().setPosition(0,0); browser.driver.manage().window().setSize(result.width, result.height); }); });
- Применены все типы ожиданий: Sleep(), неявное ожидание, явное ожидание, асинхронное ожидание: await.
- Также используется browser.driver.manage().window().maximize(); перед каждым, а не перед всеми. Но ничего из вышеперечисленного не сработало. Это сработало для нескольких тестов, но не для других.
Я запускаю тесты для проверки добавления пользовательских сценариев. Некоторые из них передаются, но не все. Во всех тестах используется тот же код, что и ниже, только несколько изменений в соответствии с тестовым примером, например, если он добавляет действительного пользователя, недопустимого пользователя… Основные общие вещи во всех сценариях добавления пользователя приведены ниже
Электронная почта:
Найдите уровень, на котором я хочу добавить пользователя:
Выберите роль:
нажмите кнопку Добавить пользователя.
Проблема, которую я заметил, связана с полем поиска и раскрывающимся списком ролей. Я думаю, что элементы в безголовом Chrome нелегко доступны или какой-то другой элемент перекрывает эти элементы.
Пожалуйста, помогите решить эту проблему. Любая помощь оценивается.
Мои тесты —
it('1. should not add user with invalid email',async function(){
browser.waitForAngularEnabled(true)
browser.wait(EC.presenceOf(basepage.Loc_user_management),5000)
await basepage.Loc_user_management.click(); // click user management menu
browser.waitForAngularEnabled(true);
browser.wait(EC.presenceOf(userpage.Loc_add_user_btn),5000)
await userpage.Loc_add_user_btn.click();
browser.waitForAngularEnabled(true)
await userpage.Loc_email_addr_txtbox.click();
await userpage.Loc_email_addr_txtbox.sendKeys(loginData.users.invalid_username);
browser.manage().timeouts().implicitlyWait(1000);
browser.wait(EC.presenceOf(userpage.Loc_primarylevel_searchbox),5000);
userpage.Loc_primarylevel_searchbox.isDisplayed().then(async function(){
await userpage.Loc_primarylevel_searchbox.click();
await userpage.Loc_primarylevel_searchbox.sendKeys('Clients');
browser.actions().sendKeys(protractor.Key.ARROW_DOWN);
browser.actions().sendKeys(protractor.Key.ENTER);
//userpage.Loc_primarylevel_searchbox.click();
})
browser.sleep(500)
browser.waitForAngularEnabled(true);
browser.wait(EC.presenceOf(userpage.Loc_role_dropdown),5000)
await userpage.Loc_role_dropdown.click();
browser.waitForAngularEnabled(true)
await element(by.cssContainingText('option', 'Role1')).click();
browser.wait(EC.presenceOf(userpage.Loc_add_btn),5000)
userpage.Loc_add_btn.click().then(async function(){
expect(userpage.Loc_error_message_label.getText()).toEqual(errormessage.AddUserMessages.invalid_email_error_message);
})
});
Ответ №1:
скорее всего, это потому, что вы не справляетесь с обещаниями
browser.wait
потребности await
browser.waitForAngularEnabled
также возвращает обещание и требует await
userpage.Loc_primarylevel_searchbox.isDisplayed().then
не ждет, пока элемент отобразится, он просто получает логическое значение, отображается оно или нет, и немедленно переходит к работе. Так что в вашем случае это дополнительная строка и сложность, которые ничего не делают
sendKeys
потребности await
browser.sleep
потребности await
И не смешивайте .then
и await
. Используйте любой из них
Что происходит, когда вы не обрабатываете обещания, так это то, что protractor просто планирует выполнение команды, но не ждет ее завершения
Так совпало, что ваш скрипт работает с графическим интерфейсом, потому что Chrome требует некоторого времени для загрузки. Но когда вы запускаете тот же скрипт в headless, он становится быстрее (нет пользовательского интерфейса для загрузки) и выполняет одну команду до завершения предыдущей
Комментарии:
1. Спасибо за ваш комментарий. Это было что-то новое, что я узнал.