避免在登录表单中使用 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);
    );

ma​​in.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 重新输入用户/电子邮件和密码的主要内容,如果未能解决你的问题,请参考以下文章

将maxInstances用于webdriverio时如何处理登录用户

PHP清除浏览器缓存以避免刷新后重新发送表单数据

如何避免在php表单提交中重新加载页面

用于无头和有头的 Webdriverio 的基本身份验证

重定向到同一页面php后避免表单重新提交[重复]

引导弹出窗口中的 Django 登录表单