当我尝试从可加载文件调用函数时,'ReferenceError:未定义驱动程序'

时间:2015-12-24 09:02:04

标签: javascript node.js selenium-webdriver mocha

美好的一天。 在JS /节点我是新的。 我确实从主代码到单独的文件中创建了两个函数,现在我无法将它连接到main。 如果我在争论这个问题。帮帮我吧。我做错了什么。

以下是所做的功能:

exports.loadRegistrationForm = function() {
    driver.get('http://somesite');
    driver.getTitle().then(function(title){
        if("sometitle"===title){
            driver.findElement(webdriver.By.xpath('html/body/div/header/div/div/div[2]/div[2]/a[1]'))
                  .click();
        };
    });
    driver.wait(function(){
        return driver.isElementPresent(webdriver.By.name('fos_user_registration_form[email]'));
    }, 3000, 'Failed to load Registration form');       
}

exports.fillingRegistrationForm = function(inputEmail, inputPassword, errElement, errMessage){ 
    driver.findElement(webdriver.By.name('fos_user_registration_form[email]'))
          .sendKeys(inputEmail); 
    driver.findElement(webdriver.By.name('fos_user_registration_form[plainPassword]'))
          .sendKeys(inputPassword); 
    driver.findElement(webdriver.By.id('btn-submit')).click();//сабмит

    driver.wait(function(){
        return driver.isElementPresent(webdriver.By.xpath(errElement));
    }, 3000, 'Элемент не найден'); 

    var flow = webdriver.promise.controlFlow();
    function getErrObject(){
        errObject = driver.findElement(webdriver.By.xpath(errElement))
                        .getText()
    } 
    flow.execute(getErrObject).then(function(){
        if(errObject.value_ === errMessage){
            assert.equal(errObject.value_, errMessage);
            console.log('OK')
        };
    });
}

以下是尝试重写部分核心功能:

var assert = require("assert")
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
            withCapabilities(webdriver.Capabilities.chrome()).
            build();
var loadRegistrationForm = require('reusable_function').loadRegistrationForm;
var fillingRegistrationForm = require('./reusable_function').fillingRegistrationForm

describe('Check the Email field of the registration form.', function(){
    it('Enter an already registered Email', function(done){
        var inputEmail = '123@ya.ru';
        var inputPassword = '12345678Aa';
        var errElement = "//*[@class='form-errors server-error']";
        var errMessage = 'Email already in use';
        loadRegistrationForm();
        fillingRegistrationForm(inputEmail, inputPassword, errElement, errMessage);
        return done();
    });
});

在控制台错误中:

     ReferenceError: driver is not defined
      at exports.loadRegistrationForm (C:\Program Files\nodejs\test\reusable_fun
ction.js:9:5)
      at Context.<anonymous> (C:\Program Files\nodejs\test\test2_mocha.js:15:9)
      at callFnAsync (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\moch
a\lib\runnable.js:306:8)
      at Test.Runnable.run (C:\Users\Valentine11\AppData\Roaming\npm\node_module
s\mocha\lib\runnable.js:261:7)
      at Runner.runTest (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\m
ocha\lib\runner.js:421:10)
      at C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\runner.
js:528:12
      at next (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\r
unner.js:341:14)
      at C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\runner.
js:351:7
      at next (C:\Users\Valentine11\AppData\Roaming\npm\node_modules\mocha\lib\r
unner.js:283:14)
      at Immediate._onImmediate (C:\Users\Valentine11\AppData\Roaming\npm\node_m
odules\mocha\lib\runner.js:319:5)

我做错了什么?从可装载模块错误地写入访问功能?怎么回事?

非常感谢。

UPD。好的,我找到答案。 JS中的每个模块都有自己的范围。在模块reusable_function中没有driver变量,因此错误为not definedDriver是主模块中的变量,但它对模块reusable_function是不可见的,因为它不包含在范围内。所以我在模块driver中定义了一个变量reusable_function,并从主模块中删除了这个变量。从主驱动程序模块中删除变量不会影响其工作,因为变量driver缓存并在导入模块reusable_function期间可用。 Reusable_function:

var assert = require("assert")
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
            withCapabilities(webdriver.Capabilities.chrome()).
            build()


exports.loadRegistrationForm = function(){
    driver.get('http:...');
    driver.getTitle().then(function(title){
        if("..."===title){
            driver.findElement(webdriver.By.xpath('html/body/div/header/div/div/div[2]/div[2]/a[1]'))
                  .click();
        };
    });
    driver.wait(function(){
        return driver.isElementPresent(webdriver.By.name('fos_user_registration_form[email]'));
    }, 3000, 'Failed to load Registration form');       
};


exports.fillingRegistrationForm = function(inputEmail, inputPassword, errElement, errMessage){ 
    driver.findElement(webdriver.By.name('fos_user_registration_form[email]'))
          .sendKeys(inputEmail); 
    driver.findElement(webdriver.By.name('fos_user_registration_form[plainPassword]'))
          .sendKeys(inputPassword); 
    driver.findElement(webdriver.By.id('btn-submit')).click();//сабмит

    driver.wait(function(){
        return driver.isElementPresent(webdriver.By.xpath(errElement));
    }, 3000, 'Element not found'); 

    var flow = webdriver.promise.controlFlow();
    function getErrObject(){
        errObject = driver.findElement(webdriver.By.xpath(errElement))
                        .getText()
    } 
    flow.execute(getErrObject).then(function(){
        if(errObject.value_ === errMessage){
            assert.equal(errObject.value_, errMessage);
            console.log('OK')
        };
    });
};

主要模块(部分):

var webdriver = require('selenium-webdriver');
var flow = webdriver.promise.controlFlow();


var loadRegistrationForm = require('./reusable_function').loadRegistrationForm
var fillingRegistrationForm = require('./reusable_function').fillingRegistrationForm


describe('Check out Email form field.', function(){
    it('Enter already register Email', function(done){
        var inputEmail = '123@ya.ru'; 
        var inputPassword   = '12345678Aa';
        var errElement = "//*[@class='form-errors server-error']";
        var errMessage = 'Email already in use';
        loadRegistrationForm();
        fillingRegistrationForm(inputEmail, inputPassword, errElement, errMessage);
        flow.execute(function(){
            return done();  
        });
    });
});

它的工作。

1 个答案:

答案 0 :(得分:0)

错误行上方有一个随机funtion execute,没有任何代码。删除它,它将工作。