Selenium JavaScript和Mocha Beforeach为每个测试创建新的浏览器实例

Selenium JavaScript和Mocha Beforeach为每个测试创建新的浏览器实例,javascript,selenium,mocha.js,Javascript,Selenium,Mocha.js,我使用Selenium和JavaScript以及Mocha作为测试框架 我试图在每个测试用例之前创建一个新的webdriver实例(并且在每个测试用例之后退出驱动程序实例),使用Mocha中的beforeach()和afterEach()方法。这就是当前我的测试的样子: test = require('selenium-webdriver/testing'), webdriver = require('selenium-webdriver'); test.describe('User A Ac

我使用Selenium和JavaScript以及Mocha作为测试框架

我试图在每个测试用例之前创建一个新的webdriver实例(并且在每个测试用例之后退出驱动程序实例),使用Mocha中的beforeach()和afterEach()方法。这就是当前我的测试的样子:

test = require('selenium-webdriver/testing'),
webdriver = require('selenium-webdriver');

test.describe('User A Actions', function(){
  this.timeout(10000);

  test.describe('User A page 1', function(){
    test.it('should see X on page', function(){
      var driver = new webdriver.Builder().withCapabilities(
        webdriver.Capabilities.chrome()).build();
      driver.get('http://mywebsite.org');

      loginUserA(driver);
      goToPage1(driver);
      // assert some element is there
      driver.quit()
  });

  test.describe('User A page 2', function(){
    test.it('should see Y on page', function(){
      var driver = new webdriver.Builder().withCapabilities(
        webdriver.Capabilities.chrome()).build();
      driver.get('http://mywebsite.org');

      loginUserA(driver);
      goToPage2(driver);
      // assert some other element is there
      driver.quit()
  });
});
如您所见,它在每个测试开始时创建一个新的webdriver实例,并退出它。我觉得在每次测试的顶部都有这些是非常重复的。此外,如果测试失败,它将无法到达
driver.quit()
,这将使浏览器挂起

我希望将beforeach()方法和afterEach()方法放在顶级描述中,因此它类似于这样:

test.describe('User A Actions', function(){
  this.timeout(10000);

  beforeEach(function(){ 
    var driver = new webdriver.Builder().withCapabilities(
      webdriver.Capabilities.chrome()).build();
    driver.get('http://mywebsite.org');
  });

  afterEach(function(){
    driver.quit();
  });

  test.describe('User A page 1', function(){
    loginUserA(driver);
    goToPage1(driver);
    // assert some element is there
  });

  test.describe('User A page 2', function(){
    loginUserA(driver);
    goToPage2(driver);
    // assert some other element is there
  });
});

当我尝试此操作时,得到一个错误
ReferenceError:未定义驱动程序
。如何解决这个问题?

Mocha不会改变JavaScript范围的正常规则。如果您所做的事情不遵守JavaScript中作用域的一般规则,那么Mocha将无法让它工作

您需要在
测试中声明
驱动程序
。在每个
钩子之前描述
块而不是

test.describe('User A Actions', function(){
  var driver; // Declare it here.
  this.timeout(10000);

  test.beforeEach(function(){ 
    driver = new webdriver.Builder().withCapabilities(
      webdriver.Capabilities.chrome()).build();
    driver.get('http://mywebsite.org');
  });

  // ... etc ...

另外,请确保使用Selenium导出的API,因此
test.beforeach
而不是直接使用
beforeach
(与所有其他挂钩相同,包括您已经拥有的
afterEach
)。否则,您将跳过Selenium在使用导出的API时为您执行的控制流管理。

Mocha不会更改JavaScript作用域的正常规则。如果您所做的事情不遵守JavaScript中作用域的一般规则,那么Mocha将无法让它工作

您需要在
测试中声明
驱动程序
。在每个
钩子之前描述
块而不是

test.describe('User A Actions', function(){
  var driver; // Declare it here.
  this.timeout(10000);

  test.beforeEach(function(){ 
    driver = new webdriver.Builder().withCapabilities(
      webdriver.Capabilities.chrome()).build();
    driver.get('http://mywebsite.org');
  });

  // ... etc ...

另外,请确保使用Selenium导出的API,因此
test.beforeach
而不是直接使用
beforeach
(与所有其他挂钩相同,包括您已经拥有的
afterEach
)。否则,您将跳过Selenium在使用导出的API时为您执行的控制流管理。

谢谢!但是一个问题变成了另一个问题。。这样做似乎解决了驱动程序未定义的问题,但现在它只打开了一个浏览器,无法导航到URL。我已经用您应该做的另一个更改编辑了我的答案,这可能解释了您描述的问题。啊,我们开始了,谢谢您!非常感谢你的帮助。谢谢!但是一个问题变成了另一个问题。。这样做似乎解决了驱动程序未定义的问题,但现在它只打开了一个浏览器,无法导航到URL。我已经用您应该做的另一个更改编辑了我的答案,这可能解释了您描述的问题。啊,我们开始了,谢谢您!非常感谢你的帮助。