测试仅在无头 chrome 中失败
Test failing only in headless chrome
我使用 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>)
,它们甚至在无头 chrome 中也通过了。我还尝试将 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
},
}
当我从 chromeOptions
中删除 headless
时,此测试正常通过。知道为什么会这样吗?
编辑:这是我的 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;
我发现了问题。 Gmail 在不同的浏览器中显示不同。我在测试失败之前使用 browser.saveScreenshot('screenshot.jpg');
截取了一张屏幕截图,它显示页面看起来不同(使用我的本地语言而不是英语,并且具有不同的外观和按钮)。所以这就是为什么测试找不到具有给定标识符的按钮的原因。
我使用 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>)
,它们甚至在无头 chrome 中也通过了。我还尝试将 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
},
}
当我从 chromeOptions
中删除 headless
时,此测试正常通过。知道为什么会这样吗?
编辑:这是我的 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;
我发现了问题。 Gmail 在不同的浏览器中显示不同。我在测试失败之前使用 browser.saveScreenshot('screenshot.jpg');
截取了一张屏幕截图,它显示页面看起来不同(使用我的本地语言而不是英语,并且具有不同的外观和按钮)。所以这就是为什么测试找不到具有给定标识符的按钮的原因。