避免在登录表单中使用 WebDriverIO 重新输入用户/电子邮件和密码
Posted
技术标签:
【中文标题】避免在登录表单中使用 WebDriverIO 重新输入用户/电子邮件和密码【英文标题】:Avoid re-entering user/email and password with WebDriverIO in login form 【发布时间】:2017-11-13 11:02:51 【问题描述】:我想优化我的 WebdriverIO 测试。当我使用 WebdriverIO 运行测试套件时,我试图避免重新输入用户名和密码。 (Chrome 驱动程序)
以下两个文件属于一个模块,一共有4个模块。
第一个功能文件:
var name = 'Andrea' + Math.floor((Math.random() * 1000000) + 1);
var ssn = 'V-' + Math.floor((Math.random() * 1000000) + 1);
var url = 'http://someurl.com';
var new_contact = 'https://someurl.com/client/add';
describe('Some contact is create', function()
it('Should login to the system', function()
browser.url(url)
browser.setValue('#email','xxxxxxxx@xxxx.com')
browser.setValue('#password','xxxxxx')
browser.click('#submit');
);
it('Should be fill the form', function()
browser.url(new_contact)
browser.waitForVisible('#addClient')
browser.setValue('#clientNameTextField-inputEl',name)
browser.setValue('#clientIdentidicationTextField-inputEl',ssn)
browser.setValue('#clientAddressTextField-inputEl','El busque')
browser.setValue('#clientCicyyTextField-inputEl','Valencia')
browser.setValue('#clientEmailField-inputEl','salvador.salvatierra@alegra.com')
browser.setValue('#clientPhoneTextField-inputEl','04141234567')
browser.setValue('[name="phone2"]','04147654321')
);
it('the contact is store',function()
browser.click('=save)
browser.waitForExist('#viewClientInfoBalances')
browser.end;
);
);
);
第二个特征文件:
var url = 'http://someurl.com';
describe('We get the basic info from index contact', function()
it('Shouldlogin to the system', function()
browser.url(url)
browser.setValue('#email','xxxxxxxx@xxx.com')
browser.setValue('#password','xxxxx')
browser.click('#submit');
);
it('We should see the basic info', function()
browser.click('[href="/client"]')
browser.click('#gridview-1043-record-ext-record-66 .action-icons a:nth-child(1)')
browser.waitForExist('#viewClientInfoBalances')
browser.end();
);
);
【问题讨论】:
【参考方案1】:我看到了三种不同方法的可能解决方案:
1. 创建登录设置:
既然我看到您使用的是 Mocha,那么我会在 .before()
挂钩中的所有测试用例之前运行您的登录 sn-p:
describe("*** Test Suite", function()
before(function()
return browser
.url(url);
.setValue('#email','xxxxxxxxxxx@xxxx.com')
.setValue('#password','xxxxxxxx')
.click('#submit');
);
it("\nYour first test...\n", function()
return ...
);
it("\nYour second test...\n", function()
return ...
);
);
Obs:.before()
挂钩将仅运行一次,每个测试套件。如果您有不同的测试套件(describe
语句),每个测试用例都需要登录,那么请使用 .beforeEach()
挂钩。
更新!!!按照萨尔瓦多的要求,在评论区,添加了这部分。
您有两种方法可以做到这一点:
将您的登录名移动到wdio.config.js
beforeSuite
挂钩中:
// Hook that gets executed before the suite starts
beforeSuite: function (suite)
return browser
.url(url);
.setValue('#email','xxxxxxxxxxx@xxxx.com')
.setValue('#password','xxxxxxxx')
.click('#submit');
,
创建一个main.js
文件,在其中注入所有“模块”。您仅从该文件登录并通过 require
在其中注入所有 describe
填充的文件:
注射器:
function importTest(name, path)
describe(name, function()
require(path);
);
main.js:
describe("All your tests go here!", function ()
// Executes its content before each imported feature
beforeEach(function()
// beforeHooks
);
// Imported features/module files
importTest('Clients module', '../modules/clients.js');
//importTest('Devices module', '../modules/devices.js');
// Executes its content after all features have executed
after(function ()
// afterHooks
);
);
2. 加载自定义配置文件:
-
启动您的 WebdriverIO 测试用例,但在加载页面后添加
browser.debug()
;
访问您的网站并使用您所需的帐户登录。确保在浏览器中保存凭据;
现在我们必须保存此自定义配置文件,并在您每次启动 WebdriverIO 测试用例时加载它。在地址栏中输入 chrome://version。注意 配置文件路径 值。复制文件夹的内容(例如:对于 C:\Users\<yourUserName>\Desktop\scoped_dir18256_17319\Default
,复制桌面上的 scoped_dir18256_17319 文件夹)。此文件夹包含 THIS 当前实例上的所有操作(搜索历史记录、安装的扩展程序、已保存的帐户/已保存的凭据);李>
现在我们需要做的就是在wdio.config.js
文件中添加该文件夹的路径作为chromeOptions
参数:
chromeOptions:
//extensions: ['./browserPlugins/Avira-SafeSearch-Plus_v1.5.1.crx'],
args: [ '--user-data-dir=/Users/<yourUserName>/Desktop/scoped_dir18256_17319'
]
现在您所要做的就是使用此自定义配置文件运行您的测试用例,然后您将使用首选的用户名/密码组合登录。
Obs:您可以阅读更多关于自定义配置文件HERE,使用自定义配置文件部分。
3.加载身份验证 cookie(不适用于所有网站)
-
使用所需的用户名/密码组合登录您的网站;
打开 Chrome 控制台并转到 应用程序 选项卡,在 Cookies 菜单中;
您必须识别您的身份验证令牌(通常,所有网站都将凭据等信息存储在
cookies
中);
使用.cookie()
或.setCookie()
方法添加确切的cookie(加载您的网址后)。
代码应如下所示:
browser.setCookie(name: '<AuthCookieName>', value: '<AuthToken>');
browser.refresh();
// Sometimes you have to refresh twice
browser.refresh();
// Assert you are logged in
请参阅 THIS 我对类似问题的回答作为示例。
希望这对您有所帮助。干杯!
【讨论】:
我有一套小西装,有30多个文件,每个文件都有setValue('#email')和setValue('#password')来登录系统。我想到的是使用一些cookie,删除这个setValue,而不是放置setCookie,或者通过控制台来做:./node_modules/.bin/wdio wdio.conf.js --spec create_contact.js --sessionID ZXVZXCVZFASDFASDFASDFASDF ,我可以这样做吗? 让我更具体地说,我在模块中有一个“套件”划分(发票、联系人、付款),每个模块有大约 10 个文件来测试每个模块内的每件事,每个文件都有一个“描述”里面有一些“它”。每个模块中的每个文件都通过登录。我想要的是删除它,我想要的是当我运行单个文件时,模块或所有“套件”以某种方式执行的第一个文件看起来是凭证,所以我不会浪费时间在每个文件中登录而不是那个直接去 ex:使用 browser.url('www.someurl.com'),你知道我的意思吗? Abour 使用不同的帐户登录,这可能取决于您运行测试的位置 嘿,我已经尝试了更新,它部分工作,这就是方式,我现在不知道如何检查在登录部分之前是否有创建的 cookie?如果有cookie,它不应该做登录部分,如果没有应该做登录部分并为下一个套件创建一个cookie,只需读取cookie并避免登录,我不知道你是否清楚? 我不清楚,例如,如果我有两个文件,我想在第一个文件执行时使用你在 beforeSuite 中告诉我的内容,但我想要的是在第二个文件执行时,不要再次通过抛出登录,就像我理解 beforeSuite 将在每次执行套件时执行,对吗?以上是关于避免在登录表单中使用 WebDriverIO 重新输入用户/电子邮件和密码的主要内容,如果未能解决你的问题,请参考以下文章