提问者:小点点

无法通过在网页上找不到元素来调用


我正在使用PageObject从头开始编写一个selenium项目。

下面的代码失败了,因为selenium网络驱动程序没有在网页上找到元素。

这是我得到的错误:

java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.SearchContext.findElement(org.openqa.selenium.By)" because "this.searchContext" is null

DriverBase.java:

在这节课中,我设置了驱动程序

package com.EbankingA11y.base;

import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import com.EbankingA11y.util.WebListener;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class DriverBase {
       
        protected static final Logger LOG = (Logger) LogManager.getLogger(WebListener.class);

        public static WebDriver driver;
        public static Properties prop;
        public static FileInputStream fis;
        
        public DriverBase()  {
            
            prop = new Properties();
            
            try {
                fis = new FileInputStream("C:\\Users\\config.properties");
            } catch (FileNotFoundException exception) {
                exception.printStackTrace();
                LOG.debug(" Error \n " +exception.getStackTrace());

            }
            try {
                prop.load(fis);
            } catch (IOException exception) {
                exception.printStackTrace();
                LOG.debug(" Error \n " +exception.getStackTrace());
            }
        }
        
        public static void initialization () throws InterruptedException {
            System.setProperty("webdriver.chrome.driver", prop.getProperty("WEB_DRIVER_PATH") );
            //WebDriverManager.chromedriver().setup();
            
            ChromeOptions chromeOptions = new ChromeOptions();
            chromeOptions.setAcceptInsecureCerts(true);

            driver = new ChromeDriver(chromeOptions);
            driver.manage().window().maximize();
            driver.get(prop.getProperty("URL"));
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        }
    }

LoginPage.java

在这个类中,我创建登录页面上的所有元素和所有方法

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.EbankingA11y.base.DriverBase;

public class LoginPage extends DriverBase {

    public LoginPage() {
        PageFactory.initElements(DriverBase.driver, this);
    }
    @FindBy(name="username")
    WebElement usernameTextBox;
    
    @FindBy(name="password")
    WebElement passwordTextBox;
    
    @FindBy(xpath="//input[@value=\\\"Use 'Enter' to confirm\\\"]")
    WebElement submitButton;
    
    @FindBy(xpath="//button[@name='button']")
    WebElement languageButton;  
            
    @FindBy(name="smsCode")
    WebElement tokenTextBox;


    public void performLogin () {
        //WebDriverWait wait = new WebDriverWait(driver,30);

        final String username = prop.getProperty("USERNAME");
        final String password = prop.getProperty("PASSWORD");
        System.out.println(username);

        //wait.until(ExpectedConditions.visibilityOf(this.usernameTextBox));
        usernameTextBox.clear();
        passwordTextBox.clear();
        usernameTextBox.sendKeys(username);
        passwordTextBox.sendKeys(password);
        
        submitButton.click();
        
        //wait.until(ExpectedConditions.visibilityOf(this.tokenTextBox));

    }
}

LoginPageTests.java:

在这个类中,我编写测试,并从LoginPage.java类调用方法

package com.EbankingA11y.testcases;

import java.io.IOException;

import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import com.EbankingA11y.base.*;
import com.EbankingA11y.pages.LoginPage;


public class LoginPageTest extends DriverBase {
    

    public LoginPageTest() throws IOException {
        super();
    }
    
    LoginPage loginPage = new LoginPage();
    
    @BeforeTest
    public void setup() throws InterruptedException {
        initialization();
    }

    @Test
    public void login()  {
        loginPage.performLogin();
    }
}

共1个答案

匿名用户

我发现我必须在初始化()之后声明之前方法中的页面

public class LoginPageTest extends DriverBase {
    

    public LoginPageTest() throws IOException {
        super();
    }
    

    // here
    LoginPage loginPage; 
    TokenPage tokenPage;
    
    @BeforeTest
    public void setup() throws InterruptedException {
        initialization();
      

         //here
         loginPage = new LoginPage(); 
         tokenPage = new TokenPage();
    }

    @Test
    public void login()  {
    tokenPage = loginPage.performLogin();
        
}
}

这对我很管用