Selenium - org.openqa.selenium.remote.SessionNotFoundException:会话ID为null

时间:2016-10-21 09:54:02

标签: java selenium-webdriver cucumber-jvm

我可以运行单个测试,但在尝试执行第二个测试时,会抛出此异常。

问题是我通过所有页面的驱动程序是静态的,当我在测试之间关闭浏览器时,它被设置为null并且不再工作,仅适用于第一个场景。

我的疑问是如何修改代码以使其在所有测试中运行,在两者之间关闭浏览器。

package com.***.pageobjects;

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver;

public class Browser {

    private static WebDriver driver = new ChromeDriver();

      public static WebDriver driver() {    
          return driver;
      }

      public static void open(String url) {    
          driver.get(url);
      }

      public static void close() {    
          driver.quit(); 
          System.out.println(driver.toString());
      }

}




public class LoginPage extends LoadableComponent<LoginPage> {

    private WebDriver driver;

    static String url = "***";
    private static String title = "***";



    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this); 
        }

      @Override  
      protected void load() {    
          Browser.open(url);
          driver.manage().window().maximize();  
      }

      @Override  
      protected void isLoaded() throws Error {    
          assertTrue("Login page not loaded",        
                  driver.getTitle().equals(title));  
      } 


      public MainPage MainPage() {    
          MainPage mainpage = new MainPage(driver);    
          return mainpage;
          }
}


public class MainPage {

     private WebDriver driver;


        @FindBy(id = "user-userName")
        private WebElement userName;

        @FindBy(id = "password") 
        private WebElement pwd;

        @FindBy(id = "btnLogin") 
        private WebElement buttonlogin;

        public MainPage(WebDriver driver) {    
            this.driver = driver;
            PageFactory.initElements(driver, this);
        }


          public void login(String user, String password)
          {
              userName.sendKeys(user);
              pwd.sendKeys(password); 
              buttonlogin.click();

          }
}

public class areaPersonalSuite {



    @cucumber.api.java.Before
    public void beforeScenario() {
        System.setProperty("webdriver.chrome.driver","./src/test/resources/drivers/chromedriver");

    }

     @Given("Soy cliente") 
      public void soyCliente() {    

     }

    @When("^Accedo a mi Area Personal con usuario (.*) y password (.*)$")         
    public void accedoAreaPersonal(String user, String password){
          // Create an instance of Home page     
          LoginPage loginpg = new LoginPage(Browser.driver());
          // Navigate to the Home page      
          loginpg.get();
          loginpg.MainPage().login(user,password);

      }

    @Then ("el sistema muestra mi dirección, teléfono y email correctamente")
    public void direccionTelefonoEmail(){
        LoginPage telefono = new LoginPage(Browser.driver());
        telefono.MainPage().addressCheck();



      @cucumber.api.java.After
      public void afterScenario() {
          Browser.close();

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你的问题更多的是关于驱动程序管理。我建议使用经过验证的现有框架,如QAF来处理驱动程序管理。

它允许您通过属性或运行配置xml文件配置驱动程序,并根据运行配置为测试用例创建驱动程序实例。您也可以在不同的浏览器上运行相同的测试,无需修改代码。

public class LoginPage extends WebDriverTestPage{
    @FindBy("locator.in.repository")
    private WebElement ele;

    public WebElement getEle(){
      return ele;
    }
}

您也可以使用QAF中使用的BDD gherkin with QAF。您可以查看sample project或此处QAF gherkin example