javascript - 在 webdriver.io 中创建页面对象有错误。setValue 不是函数/无法读取未定义的属性“setValue”
问题描述
我正在使用页面对象文件(login.po.js)和测试规范文件(test.spec.js)创建一个 webdriver.io 自动化,但是当我调用它时它似乎无法识别该对象测试规范文件(test.spec.js),它显示一个错误LoginPage.username.setValue is not a function
。
下面是我的代码:
登录.po.js
var LoginPage = {
username: { get: function () { return $('#email'); } },
password: { get: function () { return $('#password'); } },
form: { get: function () { return $('#login'); } },
flash: { get: function () { return $('#flash'); } },
submit: { value: function() {
this.form.click();
} }
};
module.exports = LoginPage;
test.spec.js
var LoginPage = require('../page/login.po');
const userObj = {
user: 'username@email.com',
password: 'password',
}
var assert = require('assert');
describe('login form', () => {
it('should deny access with wrong creds', function () {
LoginPage.username.setValue('username');
LoginPage.password.setValue('password');
LoginPage.submit();
browser.pause(5000);
expect(LoginPage.flash.getText()).to.contain('Your username is invalid!');
});
it('should allow access with correct creds', function () {
LoginPage.username.setValue(userObj.user);
LoginPage.password.setValue(userObj.password);
LoginPage.submit();
browser.pause(5000);
expect(LoginPage.flash.getText()).to.contain('You logged into a secure area!');
});
});
运行时出现的错误是:
1) login form should deny access with wrong creds
LoginPage.username.setValue is not a function
TypeError: LoginPage.username.setValue is not a function
at Context.<anonymous> (D:\MyTest00\specs\test.spec.js:31:28)
at Context.executeSync (D:\MyTest00\node_modules\@wdio\sync\build\index.js:56:18)
at D:\MyTest00\node_modules\@wdio\sync\build\index.js:82:70
2) login form should allow access with correct creds
LoginPage.username.setValue is not a function
TypeError: LoginPage.username.setValue is not a function
at Context.<anonymous> (D:\MyTest00\specs\test.spec.js:45:28)
at Context.executeSync (D:\MyTest00\node_modules\@wdio\sync\build\index.js:56:18)
at D:\MyTest00\node_modules\@wdio\sync\build\index.js:82:70
对此的帮助将不胜感激,如果您还发现我的代码有其他问题,请协助我更正它,非常感谢
更改login.po.js中的最后一行代码
exports.LoginPage = LoginPage;
显示错误:
1) login form should deny access with wrong creds
Cannot read property 'setValue' of undefined
TypeError: Cannot read property 'setValue' of undefined
at Context.<anonymous> (D:\MyTest00\specs\test.spec.js:20:28)
at Context.executeSync (D:\MyTest00\node_modules\@wdio\sync\build\index.js:56:18)
at D:\MyTest00\node_modules\@wdio\sync\build\index.js:82:70
2) login form should allow access with correct creds
Cannot read property 'setValue' of undefined
TypeError: Cannot read property 'setValue' of undefined
at Context.<anonymous> (D:\MyTest00\specs\test.spec.js:28:28)
at Context.executeSync (D:\MyTest00\node_modules\@wdio\sync\build\index.js:56:18)
at D:\MyTest00\node_modules\@wdio\sync\build\index.js:82:70
编辑test.spec.js中的第一行代码:
var LoginPage = require('../page/login.po').LoginPage
仍然显示错误:
1) login form should deny access with wrong creds
LoginPage.username.setValue is not a function
TypeError: LoginPage.username.setValue is not a function
at Context.<anonymous> (D:\MyTest00\specs\test.spec.js:31:28)
at Context.executeSync (D:\MyTest00\node_modules\@wdio\sync\build\index.js:56:18)
at D:\MyTest00\node_modules\@wdio\sync\build\index.js:82:70
2) login form should allow access with correct creds
LoginPage.username.setValue is not a function
TypeError: LoginPage.username.setValue is not a function
at Context.<anonymous> (D:\MyTest00\specs\test.spec.js:45:28)
at Context.executeSync (D:\MyTest00\node_modules\@wdio\sync\build\index.js:56:18)
at D:\MyTest00\node_modules\@wdio\sync\build\index.js:82:70
完整代码的 github 存储库是: github.com/seanray7/pageobject-webdriverio
解决方案
规格文件
const LoginPage = require('../page/login.po').LoginPage;
const userObj = {
user: 'username@email.com',
password: 'password',
}
const assert = require('assert');
const expect = require('chai').use(require('chai-as-promised')).expect;
describe('login form', () => {
it('should have the right title ', async ()=> {
await browser.url('http://the-internet.herokuapp.com/login');
// expect(browser.getTitle()).to.eventually.equal('The Internet');
let title = await browser.getTitle();
console.log(title);
return assert.equal(title, 'The Internet');
});
it('should deny access with creds', ()=> {
return LoginPage.LoginPageLibs.Login(userObj.user,userObj.password);
});
});
页面文件
const LoginPageLocator = {
username: '#username',
password: '#password',
form: '//i[contains(text(),"Login")]',
flash: '#flash'
};
const LoginPageLibs = {
Login : async (username, password) => {
let name_ele = await browser.$(LoginPageLocator.username);
await name_ele.setValue(username);
let password_ele = await browser.$(LoginPageLocator.password);
await password_ele.setValue(password);
let sumbit = await browser.$(LoginPageLocator.form)
return sumbit.click();
},
getText:async(elem)=>{
let element = await browser.$(elem);
return element.getText();
}
}
exports.LoginPage = {LoginPageLocator,LoginPageLibs};
请参阅成功运行的此屏幕截图。
推荐阅读
- typescript - 如何使用 TypeScript 键入枚举值?
- flutter - 如何在飞镖中转换地图的关键数据类型?例如来自地图
到地图 - c - 为什么我的 searchPuzzle 函数中的 printf() 语句不起作用?
- dialogflow-es - 如果 Intent 数量超过 200,我们是否应该为所有 Intent 设置单独的函数处理程序
- jquery - 无法使用 jQuery 打开新窗口
- python - LSTM 模型实现
- python - 用漂亮的汤刮 youtube 网站
- selenium - 我在 Capturescreensot 方法和自定义侦听器中收到“java.lang.NullPointerException”
- azure - 有没有办法使用 Graph API 获取管理员同意请求列表?
- javascript - 如何在javascript中将变量修剪并保存到字符串中的第一个空格