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

如何在调用来自多个页面工厂类的方法的测试类中使用同一个浏览器实例?

盛辰沛
2023-03-14

我有两个带有选择器和方法的类(在这两个类中我都声明了webdriver)。我还使用@findby来选择定位器。

带有选择器和方法的登录页面

package objectsAndMethods;

    public class LoginPage{
     public WebDriver driver;

     HomePage homePage = new HomePage();

     public void PageFactory(WebDriver driver){
      this.driver = driver;
     }

     //Login Page
     @FindBy(id = "id") private WebElement userName;
     @FindBy(id = "id1") private WebElement password;
     @FindBy(id = "id2") private WebElement loginButton;

     Parameters Parameters = new Parameters();

     public void navigateToPage() {
      driver.navigate().to(Parameters.getBaseUrl());
      driver.manage().window().maximize();
     }

     public void fillUsername(){
      userName.clear();
      userName.sendKeys(Parameters.getUsername());
     }

     public void fillPassword(){
      password.clear();
      password.sendKeys(Parameters.getPassword());
     }

     public void clickLoginButton(){
      loginButton.click();
     }

     public void checkUserLogged(){
      WebDriverWait wait = new WebDriverWait(driver, 10);
      wait.until(ExpectedConditions.elementToBeClickable(By.id("id")));
     }
    }
public class HomePage {
      @FindBy(id = "id") private WebElement logoutButton;
      @FindBy(id = "optionId") private WebElement selectOption;

      @FindBy(xpath="/xpath") private WebElement submitButton;
     public WebDriver driver;

      public void selectOption(){
       Select droplist = new Select(selectOption);   
       droplist.selectByVisibleText(Parameters.getOption());
      }         
      public void clickSubmitButton(){
       submitButton.click();
      }
    }
package baseClasses;

    public class BaseClassTest{


     // TODO Auto-generated method stub
     @Before
     public void setUp() {
      loginPage.driver = new FirefoxDriver();
     }

     LoginPage loginPage = new LoginPage();

     @Test
     public void loginTestCase() throws IOException, InterruptedException {


      loginPage.navigateToPage();
      System.out.println("You are on " +                baseClasses.Parameters.getBaseUrl());
      Thread.sleep(2000);

  LoginPage loginPageFindBy = PageFactory.initElements(loginPage.driver, LoginPage.class);

  loginPageFindBy.fillUsername();
  Thread.sleep(2000);

  loginPageFindBy.fillPassword();
  Thread.sleep(2000);

  loginPageFindBy.clickLoginButton();
  Thread.sleep(2000);

  loginPage.checkUserLogged();
  System.out.println("User is logged");
 }

 @After
 public void tearDown() {
  loginPage.driver.quit();
 }
  public class HomePageTest extends BaseClassTest{

     //setUp();
     HomePage homePage = new HomePage();


     @Test
     public void homeTestCase() throws IOException, InterruptedException {
      super.setUp();
      super.loginTestCase();

      HomePage homePageFindBy = PageFactory.initElements(homePage.driver, HomePage.class);


      homePageFindBy.selectOption();
      Thread.sleep(2000);

      homePageFindBy.clickSubmitButton();
      Thread.sleep(2000);
     }
    }

主页测试从两个类(登录页面和主页)调用方法--它们都声明了驱动程序。问题是,当运行测试时,打开了2个firefox实例,并且只有登录测试成功执行,其他来自主页的方法都失败了。有人能帮我明白我做错了什么吗?

共有1个答案

杨柏
2023-03-14

运行HomePagetest时,BaseClastest@before注释下的setup()方法将在HomeStCase()之前调用,因为HomePagetest扩展了BaseClastest

loginpage.driver=new FirefoxDriver();打开第一个浏览器。调用super.setup()时;setup()将再次执行,并打开第二个浏览器。

只需从HometestCase()中删除super.setup();

 类似资料:
  • 我有一个类(称为name),它有如下不同的方法: alex(), john(), claire(), charles(), luke(), richard(), jen()等等 我需要逐一调用所有这些方法,例如: ... 等等 我尝试的是创建一个名称列表,并调用循环中的所有方法 但这种调用方法的方式正在失败。有没有办法在循环中调用同一类的多个方法?

  • 问题内容: 在Bruce Eckel的“ Thinking In Java,第四版”的第428页(有关类型信息的章节)中,具有以下示例: 也许我有点累,但是我看不到add()方法中对add()的调用是如何工作的。我一直认为它应该有一个引用,或者是一个静态方法(并且我在ArrayList或List中找不到静态add())。我想念什么? 我只是为自己测试,发现这可行: 问题答案: Java为这样的方法

  • 我有一个主要的“抽象”类宠物,和两个“真实”类狗和猫。当我有两个宠物的例子时,我想知道它们是否是“同一种宠物”,而不考虑它们是哪种宠物。 我试过这个 我尝试了所有评论的返回,它总是给出这样的结果: 有没有办法在主类中进行这样的测试以避免代码重复? 编辑: 多人提到它忘记了子类化部分 这可以按预期工作

  • 我有一个java类,它打开两个Chrome浏览器,分别搜索“测试1”和“测试2”。然而,一旦两个浏览器都打开,只有一个带有谷歌页面的浏览器会搜索“测试1测试2”。 我相信这个问题可能是因为我从父类调用驱动程序 = 新的 WebDriver。但是,我不确定如何解决此问题。 下面是我尝试并行运行的两个方法。 这是我用来调用它们的xml文件。 包含驱动程序的父方法 当前结果:打开两个浏览器,每个浏览器都

  • 如何使用Selenium WebDriver在不同的浏览器上同时运行多个测试? 我是用java工作的,我甚至试着下载了selenium网格:selenium-server-standalone-2.33.0.jar文件 即使在程序之后, java-jar selenium-server-standalone-2.33.0.jar-role hub-port 4444 java-jar seleni

  • 问题内容: 我正在将Selenium WebDriver与Java和TestNG框架一起使用。我想一次在一个代码中使用Firefox,IE,Chrome来进行跨浏览器测试。我只能将Firefox初始化为 但无法以相同方式初始化其他浏览器。例如: 给出错误 给出错误 如何初始化IE和Chrome并在所有所需的浏览器中执行测试? 问题答案: 对于C# 加 创建一个包含浏览器名称的配置文件。实现与配置文