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

页面工厂在Selenium中返回null

江宏深
2023-03-14

我有hooks.java用于驱动程序类,loginpage.java用于所有登录页面对象和步骤定义类。我的页面工厂对象没有在我的登录类中初始化,它返回null由于null驱动程序。具有@before标记的驱动程序类,它的initiate在除驱动程序之外的所有类之前为空。当我使用PageFactory.InitElements(driver、LoginPage.Class)时;在时间页工厂初始化的钩子类中,程序成功运行。我正在LoginPage构造函数中使用它,只是想知道我做错了什么。为什么页面工厂返回NULL?如何使用页面工厂。

以下是错误java.lang.NullPointerException:无法调用“org.openqa.selenium.webelement.SendKeys(java.lang.CharSequence[])”,因为“steps.loginpage.txtUsernameBox”为空

请帮帮忙。谢谢

Hooks.java 
package steps;


import Util.GetConfigProp;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import io.cucumber.java8.En;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.PageFactory;

import java.io.IOException;

import java.net.URL;
import java.util.concurrent.TimeUnit;

public class Hooks extends BaseUtil implements En {

    BaseUtil base;
    //    GetConfigProp prop;
    static GetConfigProp prop;

    static {
        try {
            prop = new GetConfigProp();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Hooks() {
        //Default constructor
        Before(() -> {
            DesiredCapabilities cap = new DesiredCapabilities();
            cap.setBrowserName("chrome");
            cap.setPlatform(Platform.WINDOWS);
            cap.setCapability("marionette", true);
            ChromeOptions COptions = new ChromeOptions();
            COptions.merge(cap);

            String hubUrl = null; //get hub url from properties file
            hubUrl = prop.getHubUrl();
            base.driver = new RemoteWebDriver(new URL(hubUrl), COptions);

            base.driver.navigate().to(prop.getUrl()); //get url from properties file
            base.driver.manage().window().maximize();
            base.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//            PageFactory.initElements(driver, LoginPage.class);

        });
    }

    public Hooks(BaseUtil base) {
        this.base = base;
    }


    public WebDriver getDriver() {
        return base.driver;

    }

    @After
    public void tearDown() {
        base.driver.quit();

    }
}
LoginPage.java
    package steps;


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;

public class LoginPage extends BaseUtil {
    BaseUtil base;
    @FindBy(how = How.ID, using = "user-name")
    public static WebElement txtUserNameBox;

    @FindBy(how = How.ID, using = "password")
    public static WebElement txtPassword;

    @FindBy(how = How.ID, using = "login-button")
    public static WebElement btnLogin;

    public LoginPage() {
        //Default constructor
          }
    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }


    public void login() {

        System.out.println("this is title" + base.driver.getTitle());
        System.out.println("this is getwindow" + base.driver.getWindowHandle());
        txtUserNameBox.sendKeys("standard_user");
        txtPassword.sendKeys("secret_sauce");
        btnLogin.click();
    }

public void loginPassword() {
   //to be implement

}
}
MyStepdefs8.java
    package steps;

import io.cucumber.java8.En;


public class MyStepdefs8 extends LoginPage implements En {

    BaseUtil base;
    LoginPage login = new LoginPage();

    public MyStepdefs8(BaseUtil base) {
        this.base = base;
    }

    public MyStepdefs8() {
        Given("the user is on landing page", () -> {
            login.login();
        });
        When("^the user clicks button$", () -> {
            System.out.println("this is second step");
            loginPassword();
        });
    }

}

共有1个答案

章德惠
2023-03-14

在类MyStepdefs8中,当创建LoginPage的对象时,初始化LoginPage类的默认构造函数。因此,当您调用WebElements时,它返回null,因为它们尚未初始化。

LoginPage login = new LoginPage(driver);
 类似资料:
  • 创建基类: 然后初始化页面对象: 然后创建测试用例: 输出: 请告诉我怎么了。

  • 问题内容: 我第一次尝试AngularJS。我正在使用工厂从http-get请求中获取JSON数据,但是在完成ajax请求之前,该对象返回为空。 厂: 控制器: 这就是我想出的。当控制器设置$ scope.photos时,该值为空,就好像它在填充ajax响应之前返回photos数组。 问题答案: 您应该修改代码以返回承诺并使用控制器中的值,请参见伪修改后的代码 和控制器-

  • 我正在使用Selenium Python与美丽的汤一起刮数据。点击实时按钮后,我需要网站的html。我要点击按钮,但是新的超文本标记语言没有返回给我。我以为点击按钮后,html会很快返回,所以我睡了一觉。但即便如此,它只返回类“Collapsible__contentInner”的空div。 结果

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

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

  • 问题内容: 我是AngularJS的新手,因此遇到了这个问题。 我可以在所有注入了控制器的工厂中重新注入我的工厂单例对象吗? 例如: 在MedicalCenterController中,当应用程序启动时,我得到了带有医疗中心的单例对象: 但是稍后,我尝试在AccountProfileController中编辑医疗中心字段(名称,地址等)。 我期望的是具有更新字段的对象。如何返回我的单身人士的新实例