Тест не пройден только в безголовом хроме
У меня есть некоторые интеграционные тесты с использованием wdio, они все проходят. Однако, когда я запускаю их в Chrome без головы, один из этих тестов не проходит. Я получаю эту ошибку:
1) Reset password by submitting a new password "before all" hook:
element ("#identifierNext") still not existing after 15000ms
Проблема в этой строке кода:
browser.waitForExist('#identifierNext');
Что странно, потому что я использую waitForExist(<element id>)
в других тестах так же и они проходят даже в безголовом хроме. Я также пытался увеличить waitFor
ограничить до 30000 мс, но все равно не получится.
Это мой конфиг wdio:
exports.config = {
specs: [
'./test/pageobjects/**/reset_password.spec.js'
],
maxInstances: 1,
capabilities: [{
maxInstances: 1,
browserName: 'chrome',
'goog:chromeOptions': {
args: ['--headless', '--disable-gpu', '--window-size=1280,800', '--no-sandbox', '--disable-dev-shm-usage']
}
}],
sync: true,
logLevel: 'silent',
coloredLogs: true,
deprecationWarnings: true,
bail: 0,
screenshotPath: './errorShots/',
baseUrl: 'http://127.0.0.1:3000',
waitforTimeout: 10000,
connectionRetryTimeout: 90000,
connectionRetryCount: 3,
services: ['selenium-standalone'],
framework: 'mocha',
reporters: ['spec'],
mochaOpts: {
ui: 'bdd',
timeout: 30000
},
}
Когда я удаляю headless
из chromeOptions
Тест проходит нормально. Есть идеи, почему это происходит?
РЕДАКТИРОВАТЬ: это мой файл reset_password.spec.js:
describe ('Reset password by submitting a new password', function(){
//test fails in this before function
before(function(){
browser.url(ResetPassword.token_url(valid_email, email_password));
});
it ('Password reset without passwords', function(){
.
.
.
})
});
И мой файл reset_password.page.js:
const Page = require('./page');
class ResetPassword extends Page {
get email() {
return $('input[type="text"]');
}
get url() {
return browser.getUrl();
}
open() {
super.open('/reset-password');
}
get signIn(){
browser.waitForExist('*=Sign in');
return $('*=Sign in');
}
get enterEmail(){
browser.waitForExist('input[type="email"]');
return $('input[type="email"]');
}
get submitEmail(){
//this fails in headless mode
browser.waitForExist('#identifierNext');
return $('#identifierNext');
}
get enterPassword(){
browser.waitForExist('#password > div.aCsJod.oJeWuf > div > div.Xb9hP > input');
return $('#password > div.aCsJod.oJeWuf > div > div.Xb9hP > input');
}
get submitPassword(){
browser.waitForExist('#passwordNext');
return $('#passwordNext');
}
get tokenEmail(){
browser.waitForExist('span[email="profiq.ldap@gmail.com"]');
return $$('span[email="profiq.ldap@gmail.com"]');
}
get tokenURL(){
browser.waitForExist('a[id*=reset_link]');
const links = $$('a[id*=reset_link]');
return links[links.length-1].getAttribute('href');
}
token_url(email, password){
browser.url('https://www.google.com/gmail/about/#');
this.signIn.click();
browser.switchTab(browser.getTabIds()[1]);
this.enterEmail.setValue(email);
this.submitEmail.click();
this.enterPassword.setValue(password);
this.submitPassword.click();
this.tokenEmail[1].click();
browser.pause(3000);
return this.tokenURL;
}
}
module.exports = ResetPassword;
1 ответ
Я нашел проблему. Gmail по-разному отображается в разных браузерах. Я сделал скриншот с помощью browser.saveScreenshot('screenshot.jpg');
незадолго до того, как тест не пройден, и он показывает, что страница выглядела иначе (была на моем местном языке, а не на английском и имела другой внешний вид и кнопки). Это и есть причина, по которой тест не смог найти кнопку с заданным идентификатором.