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

如何在java中将类链接到登录类

李星波
2023-03-14

大家好,我是Java新手,我一直在为Cucumber创建Java代码,场景是我创建了一个登录类,包括调用web驱动程序、输入用户名和密码并单击登录按钮,现在这个代码运行良好,现在我创建了一个新类,这个类是该网页中的一个新功能,例如AddNewUser,我不想在AddNewUser类中再次编写我在login类中编写的所有代码,如何在AddNewUser类中调用login类?我做了以下几件事:

  1. LoginSteps login=new LoginSteps(驱动程序);-这会导致错误(java:class StepDefinitions.LoginSteps中的构造函数LoginSteps无法应用于给定类型;必需:未找到参数:org.openqa.selenium.WebDriver原因:实际参数列表和形式参数列表长度不同)

下面是我登录步骤的代码。JAVA


import io.cucumber.java.en.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import pagefactory.LoginPage_PF;


public class LoginSteps {
    WebDriver driver;
    LoginPage_PF login;


    @Given("that customer wanted to login at the On Demand Portal")
    public void that_customer_wanted_to_login_at_the_On_demand_portal() {

        String projectPath = System.getProperty("user.dir");

        System.setProperty("webdriver.chrome.driver", projectPath+"/src/test/resources/drivers/chromedriver.exe");

        driver = new ChromeDriver(new ChromeDriverService.Builder().usingPort(9515).build());
        driver.manage().window().maximize();

    }

这是我ser.java的代码


import StepDefinitions.LoginSteps;
import StepDefinitions.LogoutSteps;
import io.cucumber.java.en.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;


public class AddNewUser {
    WebDriver driver;

    LoginSteps login = new LoginSteps();

    @Given("that customer wanted to Add New User at the On Demand Portal")
    public void that_Customer_Wanted_To_Add_New_User_At_The_On_Demand_Portal() {
        driver.manage().window().maximize();
    }

    @And ("the user is in the On Demand Portal Dashboard")
    public void the_user_is_in_the_on_demand_portal_dashboard() {
        driver.get("URL");
        driver.manage().window().maximize();
    }

这是我的pageFactory代码:


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;

public class LoginPage_PF {

    @FindBy(name = "email")
    WebElement txt_username;

    @FindBy(name = "password")
    WebElement txt_password;

    @FindBy(css = ".MuiButton-label")
    WebElement btn_login;

    WebDriver driver;

    public LoginPage_PF(WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(new AjaxElementLocatorFactory(driver, 30), this);
    }

    public void enterUsername(String username){
        txt_username.sendKeys(username);
    }

    public void enterPassword(String password){
        txt_password.sendKeys(password);
    }

    public void clickLogin(){
        btn_login.click();
    }
}

共有1个答案

赵宏达
2023-03-14

您正在初始化类LoginSteps login=new LoginSteps()但是驱动程序是在LoginSteps类中创建的,因此驱动程序为空。我认为一种方法是利用依赖注入在每个场景中初始化驱动程序

您可以使用cucumber-guice来初始化web驱动程序。这也将使您的测试场景独立,因为为每个场景创建了一个新的驱动程序实例。根据我在测试中的表现,您可以做些什么

要使用cucumber guice,您需要

 <dependency>
      <groupId>io.cucumber</groupId>
      <artifactId>cucumber-guice</artifactId>
      <version>${cucumber.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>4.2.3</version>
      <scope>test</scope>
    </dependency>

然后在全局类中使用@ScenarioScoped并初始化驱动程序登录页面_PF

import org.openqa.selenium.WebDriver;
import io.cucumber.guice.ScenarioScoped;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.PageFactory;  
import io.cucumber.guice.ScenarioScoped;
 
 @ScenarioScoped
    
          public class Global {
          public WebDriver driver;
           public WebDriverWait wait;
        
          public Global() {
               //implement getDriver in `loginSteps` or any other class to return driver . However , I think login steps and driver initialization should be separate
                driver = new LoginSteps().getDriver();

               //also initialize LoginPage_PF here 
                PageFactory.initElements(new AjaxElementLocatorFactory(driver, 30), LoginPage_PF.class);       
          }
    
    }

然后在测试类中,这是AddNewUser

    import StepDefinitions.LoginSteps;
import StepDefinitions.LogoutSteps;
import io.cucumber.java.en.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
// import Global here

    public class AddNewUser {
       
        //inject `Global` here 
          @Inject
       Global global;
    
        @Given("that customer wanted to Add New User at the On Demand Portal")
        public void that_Customer_Wanted_To_Add_New_User_At_The_On_Demand_Portal() {
            //access pageobjects . if you want to access driver for some reason for ex: opening a page , just use global.driver

            LoginPage_PF.txt_username.sendKeys("username")
            ...
            ...
         
        }
    
        @And ("the user is in the On Demand Portal Dashboard")
        public void the_user_is_in_the_on_demand_portal_dashboard() {

            // access page objects here 
        }

除了Global类之外,您不需要在任何其他地方初始化驱动程序。更多关于cucumber-guice的信息

 类似资料:
  • 一些背景,我正在开发Java游戏,我正在使用Netbeans来构建它,我目前有2个java文件 App.java 董事会.java 现在我可以创建和显示一个简单的棋盘与所有的棋子在正确的位置我的问题是分配任何鼠标事件到这些棋子 目前,我使用textpad编写测试代码,并且没有图像的文件夹链接,并且已经能够让鼠标事件在那里工作,因此我知道事件的代码没有问题。 但是现在我正在Netbean中编写程序清

  • 我几乎完成了我的一个项目(对我来说,我是一个初学者)。我想隐藏登录链接时,一个角色(管理员或用户)是登录到数据库。我还想显示一个名为“添加等级”的链接,仅当Admin(Manager)登录时。我正在使用spring boot、Tymeleaf、spring security5和h2&JDBC。 总之,我想隐藏或显示基于用户角色的HTML 更新:当我使用 匿名用户 这是我在navbar中包含或不包含

  • 问题内容: 如何在Eclipse中将源链接到jar包? 我正在尝试添加外部库。 我将jar文件添加到了构建路径,但是当我尝试运行该应用程序时,它返回了以下错误: jar文件ch.ntb.usb没有源附件。 我已经使用JD-GUI来反编译jar文件,并且包含了源代码。 问题答案: 解压缩jar文件后,我将带有jd-gui的所有资源“ ch.ntb.usb.src”保存到了我的构建路径中。然后,将外部

  • 我正在开发一个梦幻运动应用程序。用户可以创建一个联盟,如果成功,将获得一个邀请链接与其他人共享。如果用户未登录,则除登录和注册页面外的所有路由都无法访问,因此当有人使用邀请链接时,它会将其发送到登录页面。 如何保存邀请链接,以便在他们登录/注册时可以返回邀请链接? 我尝试过使用,但它给了我“localhost:3000”而不是“localhost:3000/invite/:leagueid”。我正

  • 问题内容: 考虑下面的类 问题在于上面的方法太长并且有很多 语句。我想到了一些重构,但是仍然不确定该怎么做。我在考虑类似连锁模式的东西。然后,我将实现几个检查器类,这些检查器类调用链中的下一个检查器,或者返回相应的。 但是后来我有了一个更好的主意(至少我是这样认为的):为什么表现得不像Java 8?我想用类似的- - -pattern。但是我不知道如何实现这一点。我在想类似的东西: 这个想法是:当

  • 我正在开发一个基于Spring Boot的web应用程序,主页包含一个带有登录和注册链接的boostrap navbar。 一旦用户登录(通过单击从主页登录链接),他们将再次被重定向到主页(除非他们在spring security启动A&A之前访问任何其他链接)。在重定向,我想隐藏登录和注册链接从navbar和显示注销链接在他们的地方。因为我想在应用程序的所有页面中插入navbar。 我想知道什么