【问题标题】:Page object model not extending driver from class页面对象模型未从类扩展驱动程序
【发布时间】:2016-05-10 08:53:24
【问题描述】:

基类:

protected WebDriver driver;
protected String URL = "https://www.example.com/";
public static String SignupURL = "https://www.example.com/login";
public Login loginpage;

@BeforeClass
public void setup()
{

    System.setProperty("webdriver.chrome.driver","E:\\Selenium-Webdriver\\Chrome_Driver\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.navigate().to(URL);
    loginpage = PageFactory.initElements(driver,Login.class);

}

登录类:

protected WebDriver driver;

public Login(WebDriver driver) {
    this.driver = driver;}

public Login Method1()
{

    //Logic

}

LoginTest 类:

  public class LoginTest extends Base {

  @Test
 public void method1()
 {
        setup() //Have to Call it
       //Logic

  }

 @Test 
 public void method2
 {   
     setup() //Have to Call it 
     //Logic
  }

}

问题是为什么它需要为测试类中的每个方法调用 setup() 方法。

我已经在扩展类然后驱动程序应该自动调用但它不是。当我不调用 setup() 然后得到 Nullpointer Exception,如果我调用它,那么系统会为每个方法打开新的浏览器。

【问题讨论】:

  • 您能否粘贴您收到的完整错误消息。我认为这是因为脚本无法识别驱动程序。
  • 乍一看代码还可以,你不需要在每个方法中调用setup,你可以分享你的跟踪日志可能是生成空指针一些其他代码,
  • 使用@BeforeTest 注释并公开webdriver……它对我有用……我认为这也会帮助你
  • @noor - 我试过了,但似乎不起作用。

标签: java selenium-webdriver testng pageobjects


【解决方案1】:

您在基类中使用@BeforeClass,如果将其更改为@BeforeSuite,则无需调用该设置方法。通常我会在 mybase 类中使用 @BeforeSuite 并将其扩展到所有测试类以在该浏览器上工作。

下面一个对我有用

 import java.util.concurrent.TimeUnit;

 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.firefox.FirefoxDriver;
 import org.testng.annotations.BeforeSuite;

 public class Base {


protected WebDriver driver;
protected String URL = "https://www.google.com/";
public static String SignupURL = "https://www.google.com/";
//public Login loginpage;

@BeforeSuite
public void setup()
{

  //  System.setProperty("webdriver.chrome.driver","E:\\Selenium-Webdriver\\Chrome_Driver\\chromedriver.exe");
    driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.navigate().to(URL);
   // loginpage = PageFactory.initElements(driver,Login.class);

}


}


import org.testng.annotations.Test;

public class TestCasePage1 extends Base{

@Test
public void testit(){
    System.out.println(driver.getTitle());
}

@Test
public void testit1(){
    System.out.println(driver.getTitle());
}

}

谢谢你, 壁画

【讨论】:

  • 谢谢,但我在使用 @BeforeSuite 时收到 java.lang.NullPointerException
  • 您可以通过更改受保护的 WebDriver 驱动程序尝试一次吗?到公共静态 WebDriver 驱动程序;一次
  • 更新的答案.. 看起来你得到 null 因为方法 1 中的逻辑可能是你从驱动程序为 null 的 LoginPage 调用
  • 我无法对您所做的行进行计算,因为我的登录页面的每个方法都返回登录数据类型的对象:(
【解决方案2】:

问题是@BeforeClass 错过了(alwaysRun=true)。所以,如果在你的基类中,你写@BeforeClass(alwaysRun=true)。那么你就不需要在其他类中调用 setup 了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多