【问题标题】:WebDriver. Not able to run tests after using parametrized class网络驱动程序。使用参数化类后无法运行测试
【发布时间】:2013-08-16 21:22:59
【问题描述】:

我需要实现一件事:每次开始测试时,我都必须登录系统。我创建了一个应该运行这个登录过程的类。我能够向这个类发送正确的值并且它能够登录,但在那之后,我在我的第二个类(它正在运行测试本身)上收到 NullPointerException。看起来它根本看不到浏览器窗口。请帮助我以一种允许我在任意数量的类中重用 Login 类的方式编写这些类。

一个用于登录:

public class Login {

    private static WebDriver driver;
    public static void Find_Fields (String path,String login, String password) {
        driver = Driver.get(path);
        WebElement login_field = driver.findElement(By.id("abc"));
        login_field.sendKeys(login);
        //Find Password Field on Start page
        WebElement password_field = driver.findElement(By.id("abc"));
        password_field.sendKeys(password);
        //Find Login Button
        WebElement login_button = driver.findElement(By.xpath("abc"));
        login_button.click();
    }
}

public class Testing {

    private static WebDriver driver;
    @BeforeClass
    public static void a_setup(){
        //here I'm trying to run Login with parameters
        Login fields = new Login();
        fields.Find_Fields(LOGIN_PATH, LOGIN, PASSWORD);
    }

    @Test
    public void b_Press_Login_Button(){
        //Here I'm trying to start testing in session started from a_setup()
        WebElement keyword = driver.findElement("..."));
        keyword.sendKeys("...");
    }

    @AfterClass
    public static void Close(){
        driver.quit();
        driver.close();
    }
}

【问题讨论】:

    标签: java selenium webdriver parameter-passing


    【解决方案1】:

    您有两个独立的 WebDriver 字段,每个类一个。您已经在 Login 中初始化了一个,但您没有将引用传递回 Testing 类。一种解决方案是简单地将 WebDriver 作为参数传递给 Login 构造函数:

    public class Login {
    
        private WebDriver driver;
    
        public void Find_Fields (String path,String login, String password) {
            driver.get(path);
            //(...) rest of this method is unchanged
        }
    
        public Login(WebDriver driver) {
            this.driver = driver;
        }
    }
    
    public class Testing {
    
        private static WebDriver driver;
        @BeforeClass
        public static void a_setup(){
            driver = new FirefoxDriver();        //initialize the driver
            Login fields = new Login(driver);    //pass the instance of WebDriver to login class
            fields.Find_Fields(LOGIN_PATH, LOGIN, PASSWORD);
        }
    
        //(...) rest of the class remains unchanged
    }
    

    【讨论】:

      【解决方案2】:

      您需要使用浏览器对象初始化驱动程序。像这样的东西应该可以工作:

      public static void Find_Fields (String path,String login, String password)
      {
          driver = new FirefoxDriver();
          driver.get(path);
          WebElement login_field = driver.findElement(By.id("abc"));
          login_field.sendKeys(login);
          //Find Password Field on Start page
          WebElement password_field = driver.findElement(By.id("abc"));
          password_field.sendKeys(password);
          //Find Login Button
          WebElement login_button = driver.findElement(By.xpath("abc"));
          login_button.click();
      }
      

      【讨论】:

      • 不 - 它不起作用 - 它现在打开两个浏览器窗口。我已经在私有静态 WebDriver 驱动程序中初始化了类;
      • 我在您发布的代码中没有看到初始化。我认为您遇到的问题是您引用了两个不同的驱动程序。您在测试中有一个驱动程序,在登录中有另一个驱动程序。我建议将 Login() 更改为 Login(driver) 之类的东西,并使用您在测试中已经初始化的驱动程序。
      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多