首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行断言时,我不知道为什么"this.driver是空的“

在运行断言时,我不知道为什么"this.driver是空的“
EN

Stack Overflow用户
提问于 2022-05-05 06:05:25
回答 2查看 292关注 0票数 0

如果我违反了一些准则的话,第一次发帖很抱歉。

我正在自学Java/Selenium/Chromedriver,我遇到了第一个我自己也无法解决的问题。我会尽我最大的努力在下面代表它,但如果我没有包括我需要的东西,请索取更多的信息!下面是一个测试:

代码语言:javascript
复制
    @Test
public void loginAsTomSmith(){
    LoginPage loginPage = homePage.clickFormAuthentication();
    loginPage.enterUsername("tomsmith");
    loginPage.enterPassword("SuperSecretPassword!");
    SecureAreaPage secureAreaPage = loginPage.clickLogin();
    secureAreaPage.getBannerText();

    assertTrue(secureAreaPage.getBannerText()
                    .contains("You logged into a secure area!"),"Incorrect message displayed");
}

正如您所看到的,在我的第一步中,我将驱动程序从主页直接传递到登录页面(我认为)。然后,我最终将其传递给安全区域,在运行断言时,会得到以下错误:

代码语言:javascript
复制
java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.WebDriver.findElement(org.openqa.selenium.By)" because "this.driver" is null

值得注意的是,我一直在学习一门在线课程,但是我要为这个特定的项目做一些我没有被教过的事情。例如,在本课程中,每个页面对象都是一个不同的类,而我已经决定让所有页面都是基页类的扩展,这样它们就可以更容易地共享基本方法。我开始担心那个决定会产生我不明白的后果。

不管怎么说,因为这个项目太小了,所以把它全部贴出来也许是有意义的。提前谢谢你的帮助。你作品的超级粉丝!

代码语言:javascript
复制
package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class BasePage{
    protected WebDriver driver;

    protected BasePage(WebDriver driver){
        this.driver = driver;
    }

    protected void clickLink(By linkTextBy){
        driver.findElement(linkTextBy).click();
    }

    protected void populateTextField(By textFieldBy, String inputText){
        driver.findElement(textFieldBy).sendKeys(inputText);

    }

    protected void clickButton(By buttonBy){
        driver.findElement(buttonBy).click();

    }
}
代码语言:javascript
复制
package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class HomePage extends BasePage{
//    private WebDriver driver;
    private By formAuthenticationLink = By.linkText("Form Authentication");

    public HomePage(WebDriver driver){
        super(driver);
    }

    public LoginPage clickFormAuthentication(){
        clickLink(formAuthenticationLink);
        return new LoginPage(driver);
    }

}
代码语言:javascript
复制
package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class LoginPage extends BasePage{
    private By usernameTextField= By.id("username");
    private By passwordTextField = By.id("password");
    private By loginButton = By.className("radius");


    public LoginPage(WebDriver driver){
        super(driver);
    }

    public void enterUsername(String username){
        populateTextField(usernameTextField, username);
    }

    public void enterPassword(String password){
        populateTextField(passwordTextField, password);
    }

    public SecureAreaPage clickLogin(){
        clickButton(loginButton);
        return new SecureAreaPage(driver);
    }
}
代码语言:javascript
复制
package pages;

import org.openqa.selenium.*;
import org.openqa.selenium.WebDriver;

public class SecureAreaPage extends BasePage {
    private WebDriver driver;
    private By loginBanner = By.id("flash");

    public SecureAreaPage(WebDriver driver){
        super(driver);
    }

    public String getBannerText(){
        return driver.findElement(loginBanner).getText();
    }

}
代码语言:javascript
复制
package base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import pages.HomePage;

public class BaseTests {
    private WebDriver driver;

        protected HomePage homePage;

        @BeforeClass
        public void setUp(){
            System.setProperty("webdriver.chrome.driver", "resources/chromedriver.exe");
            driver = new ChromeDriver();
            driver.get("https://the-internet.herokuapp.com/");

            homePage = new HomePage(driver);
        }

        @AfterClass
        public void tearDown(){
            driver.quit();
        }
}
代码语言:javascript
复制
package base;

import static org.testng.Assert.*;

import org.testng.annotations.Test;
import pages.LoginPage;
import pages.SecureAreaPage;

public class LoginTests extends BaseTests {

    @Test
    public void loginAsTomSmith(){
        LoginPage loginPage = homePage.clickFormAuthentication();
        loginPage.enterUsername("tomsmith");
        loginPage.enterPassword("SuperSecretPassword!");
        SecureAreaPage secureAreaPage = loginPage.clickLogin();
        secureAreaPage.getBannerText();

        assertTrue(secureAreaPage.getBannerText()
                        .contains("You logged into a secure area!"),"Incorrect message displayed");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-05 06:39:23

您的SecureAreaPage包含一个从未初始化的字段private WebDriver driver; (在您称为super(driver);的构造函数中,但从未在SecureAreaPage中初始化该字段)。

在方法getBannerText()中,调用driver.findElement(loginBanner),后者从SecureAreaPage访问字段。

因为BasePage的每个子类都可以访问BasePage中的driver字段,所以不需要hat字段。把它移开一切都会正常的。

这背后的原理是类driver的字段SecureAreaPage“阴影”类BasePage的字段driver

票数 1
EN

Stack Overflow用户

发布于 2022-05-05 06:19:05

安装的Chrome版本是否使用正确的chromedriver.exe?

不久前,这就是我遇到这个问题时的解决办法。

看一下这一页:

https://chromedriver.chromium.org/downloads

如果您使用ChromeDriver 102,请下载ChromeDriver 102.0.5005.27

如果您正在使用ChromeDriver 101,请下载ChromeDriver 101.0.4951.41

如果您正在使用ChromeDriver 100,请下载ChromeDriver 100.0.4896.60

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72122624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档