当前位置: 首页 > 知识库问答 >
问题:

页面对象工厂-NullPointerException

吕子真
2023-03-14

对登录页面使用页面对象模型和页面分解,在登录页面中获取对象。java和操作在LoginScript中。JAVA我有一个java。“Ele_usernamedit.clear();”行中的lang.NullPointerException请帮助检查代码。谢谢

这是我的登录页。爪哇:

package com.cos.pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
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 org.testng.Assert;

public class loginpage {
    public String Logout_Xpath = "//nav[@class=\"menu_right ng-tns-c1-0 ng-star-inserted\"]/a[3]/div/img";

    @FindBy(id = "email_input") 
    WebElement Ele_UserNameEdit;

    @FindBy(id = "email_input")
    WebElement USERNAME_ELE;

    @FindBy(id="password_input") 
    WebElement Ele_PasswordEdit;

    @FindBy(xpath = ".//*[@class='theme_button blue log_in_btn']")
    WebElement Ele_LoginButton;

    @FindBy(xpath = "html/body/ngb-modal-window/div/div/selectcountry/div/div/div[1]/div/div[1]/div/div/i")
    WebElement Ele_ThailandRadioButton; 

    @FindBy(xpath = "//div[@class=\"theme_button blue pointer\"]")
    WebElement Ele_ExploreThePortalButton;      

    @FindBy(xpath = "//div[@class=\"theme_button blue logout_btn\"]")
    WebElement Ele_LogoutConfirmationButton;    

    public void HomePage(WebDriver driver){
        PageFactory.initElements(driver, this);
    }

    public void enterUserName(String UserName){
        Ele_UserNameEdit.clear();
        Ele_UserNameEdit.sendKeys(UserName);
    }

    public void enterPassword(String Password){
        Ele_PasswordEdit.clear();
        Ele_PasswordEdit.sendKeys(Password);
    }

    public void clickOnLogin(WebDriver driver){
        try {
            WebDriverWait wait = new WebDriverWait(driver, 20);
            Ele_LoginButton.click();
            Thread.sleep(4000);
            Ele_ThailandRadioButton.click();
            Thread.sleep(4000);
            Ele_ExploreThePortalButton.click();
            Thread.sleep(4000);
            WebElement coslogoutLink;
            coslogoutLink = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(Logout_Xpath)));
            Assert.assertTrue(coslogoutLink.isDisplayed());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void clickOnLogout(WebDriver driver) {
        //Logout
        WebDriverWait wait = new WebDriverWait(driver, 20);
        WebElement coslogoutLink;
        coslogoutLink = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(Logout_Xpath)));
        Assert.assertTrue(coslogoutLink.isDisplayed());
        coslogoutLink.click();
        Ele_LogoutConfirmationButton.click();
        // close Fire fox
        driver.close();         
    }
}

这是我的登录cript.java:

package com.cos.test;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.cos.actions.LoginActions;

import excel.ReadDataFromExcel;

public class LoginScript extends BaseClass {

    @Test(dataProvider = "readFromExcel")
    public void testLogin(String userName, String password) {
        LoginActions actions = new LoginActions();
        actions.login(driver, userName, password);
        actions.logout(driver);
    }

    @DataProvider(name = "readFromExcel")
    public Object[][] readDataFromExcel() throws Exception {
        Object[][] dataFromExcel = ReadDataFromExcel.readDataFromExcel();
        return dataFromExcel;
    }
}

共有1个答案

车思淼
2023-03-14

首先,您已经复制了@FindBy(id="email_input")

当使用new loginpage()调用初始化时,公共类loginpage应该具有构造函数

PageFactory.initElements(driver, this);

因此,当您登录时,login=new loginpage();它不会初始化PageFactory,因为您已将其设置为方法而不是构造函数。

所以试着这样做

public LoginPage(WebDriver webDriver) { 
    super(webDriver); //this is if You extend driver from super-class
    PageFactory.initElements(webDriver, this);
}

但只需将代码添加到pagelogin类下的构造函数中。

希望这有帮助。

 类似资料:
  • 我遵循这里的POM指南 问题是当输入有效的用户/密码时,POM正在返回新的HomePage(驱动程序),新的HomePage构造函数正在通过传递的驱动程序验证我们实际上在“主页”页面上。自然,驱动程序被打开到登录页面,所以在主页上查找元素是徒劳的。POM方法应该如何将“PageFactory”主页对象实际“打开”返回到主页?

  • 创建基类: 然后初始化页面对象: 然后创建测试用例: 输出: 请告诉我怎么了。

  • 页面工厂是Joomla灵活拖放页面的革命性产品。创建任何想要美化的布局都可以在最快的时间用页面工厂页面构建器完成。不管你是初学者还是专业人士,为你的客户、公司或你自己建立网站;完全控制你的Joomla网站,并开始建立具有惊人功能的独特网站。 页面工厂是最新发布的页面工厂系列。页面工厂是一个视觉站点建设的新时代。使用令人惊奇的前端站点构建界面,页面工厂为您提供了一分钟开发站点的实时体验。这个版本的页

  • 我有一个搜索结果页面,其中包含许多作为搜索结果产生的产品项。我可以得到产品项目的清单。但是有产品细节,如价格、折扣、运输价格,作为子元素在这些网络中。如何使用页面对象工厂模型通过使用@FindBy注释自动获取这些子元素的值。 目前,我不知道如何通过在findElement(by)函数中显式提供父WebElement的上下文而不是POF的自动机制来显式地获得它们。问题是如何使上下文成为PageObj

  • 本文向大家介绍javascript工厂方式定义对象,包括了javascript工厂方式定义对象的使用技巧和注意事项,需要的朋友参考一下 每一个函数对象都有一个length属性,表示该函数期望接收的参数个数。 关于js面向对象的创建方式, 目标: 构建一个order对象. 包含三个属性:日期,金额,提交人  包含一个方法:显示字符串:”XX在XXXX-XX-XX 提交了额度为:XXXX元的订单" 一

  • 我是一名新的测试工程师,一直在阅读页面对象模型并实现它们,并不断遇到页面工厂。我知道页面工厂是一个POM,它提供了额外的功能,例如在调用页面工厂时实例化所有元素,以及更可读的测试代码(尽管我不完全赞同可读性)。明确地说,我对POM很感兴趣。代码的可重用性和相对容易的维护非常好,我正在朝着这个方向努力。 我要回答的两个问题是: 为什么我要实例化所有元素,而不是动态地进行