【问题标题】:How to stop tests in selenium using webdriver (JavaScript)?如何使用 webdriver (JavaScript) 在 selenium 中停止测试?
【发布时间】:2019-05-15 05:30:23
【问题描述】:

我在 nodejs 中使用 selenium webdriver 运行两个测试。我希望第一个测试停止,然后运行第二个。但问题是 driver.close 抛出异常。

var webdriver = require('selenium-webdriver'),
    By = webdriver.By,
    until = webdriver.until;

var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .build();

driver.get('https://www.website.com/');

var values = [{email:'correctuser@website.com',password:'correct'},{email:'wronguser@website.com',password:'wrong'}];


testCase(values[0].email,values[0].password);

// driver.close throws exception
driver.close();

testCase(values[1].email,values[1].password);

 function testCase(email,password){
  driver.wait(until.urlIs('https://www.website.com/'))
  driver.findElement(By.id('inputEmail')).clear();
  driver.findElement(By.id('inputEmail')).sendKeys(email);
  driver.findElement(By.id('inputPassword')).clear();
  driver.findElement(By.id('inputPassword')).sendKeys(password);
  driver.findElement(By.tagName('button')).click().then(()=>{
    driver.wait(until.elementLocated(By.className('alert-danger'))).then(() =>{
      console.log('Failed login case - success');
    }).catch((e)=>{
      console.log(e);
    });
    driver.wait(until.urlIs('https://www.website.com/home')).then(() => {
      console.log('Successful login case - success');
    }).catch((e)=>{
      console.log(e);
    });
  });

}

错误信息:

(node:1296) UnhandledPromiseRejectionWarning: NoSuchSessionError: invalid session id
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Mac OS X 10.13.6 x86_64)

预期结果应该是:

- Successful login case - success
- Failed login case - success

【问题讨论】:

  • 你为什么没有两种方法呢?如果失败是一个测试用例,成功应该是第二个测试用例。
  • 我想重复使用相同的函数来插入键和检测响应。

标签: javascript selenium testing selenium-webdriver webdriver


【解决方案1】:

不要使用driver.close(),使用driver.quit()

driver.close() 将关闭现有的 Selenium 窗口,如果没有窗口则会出错。它的设计目的是在打开多个不同的浏览器窗口时使用。

driver.quit() 是 selenium 中的清理命令。它将关闭所有现有窗口,然后取消引用驱动程序对象。如果当前没有打开任何窗口,则不会出错。

话虽如此,导致您出现问题的不是驱动程序关闭,而是您运行的第二个测试用例(testCase(values[1].email,values[1].password); 行)假设您有一个浏览器对象。你不这样做是因为你关闭了上一行中的最后一个窗口,这导致你的浏览器对象被垃圾。

要消除此错误,您需要调用

var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .build();

在你打电话之前再次

testCase(values[1].email,values[1].password);

*编辑*

所以给你一个完整的代码块:

var values = [{email:'correctuser@website.com',password:'correct'},{email:'wronguser@website.com',password:'wrong'}];
var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .build();

driver.get('https://www.website.com/');        
testCase(values[0].email,values[0].password);

driver.quit();

driver = new webdriver.Builder()
    .forBrowser('chrome')
    .build();

driver.get('https://www.website.com/');
testCase(values[1].email,values[1].password);

【讨论】:

  • 我尝试添加driver.quit()并再次调用driver,但它显示相同的错误。
  • 更新了答案给你一个完整的代码块,看看有没有帮助
  • 它在开始时给出相同的错误然后记录:- Failed login case - success
  • 直到driver.close() 之前的代码也会抛出相同的异常。问题似乎在于调用driver.close()driver.quit()。每当我调用其中任何一个时,都会引发相同的异常。
  • 如果您调用 close 或 quit 然后尝试使用驱动程序对象,那么您将看到此错误。它告诉您您正在尝试使用尚未实例化的驱动程序对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2023-04-03
  • 2019-10-31
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多