我们如何初始化webdriver实例而不将其声明为静态并在所有pageObjects classe中使用相同的实例

时间:2017-03-12 18:29:08

标签: java selenium selenium-webdriver constructor pageobjects

<?php

$path = session_save_path();

$files = glob($path.'/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

?>

在Page Class

为什么我们需要扩展基类的每个页面类中的构造函数。这个构造函数的目的是什么以及它是如何工作的。 我对页面类中构造函数的使用感到困惑。请帮助我理解它在这里工作。谢谢提前..

2 个答案:

答案 0 :(得分:0)

你的问题并不完全清楚,因为在标题中你会问别的东西而不是问题的内容,但我会尽力回答:

我认为如何在不使用静态驱动程序的情况下初始化WebDriver有两种选择。

第一个选项:您不会使用构造函数,但每次运行测试时都会初始化Web驱动程序ucalling setUp()方法。

for

第二个选项:您将使用Page Class中的构造函数初始化Base类中的Web驱动程序。在这里你总是可以传递webdriver的同一个实例。 (更新此选项并不好)

public class Base {
   protected WebDriver driver;

   @BeforeClass
   public void setUp() {
       System.setProperty("webdriver.chrome.driver","chromedriver.linux");
       driver = new ChromeDriver();
   }
   @AfterClass
   public void tearDown() {
       driver.quit();
   }
}


public class Page extends Base {
    @Test
    public void testPage() {
        driver.get("https://www.google.co.uk/");
    }
}

或许澄清你的问题会有所帮助

UPDATE第二个选项是错误的,如果你使用junit或ngtest你应该使用no-arg构造函数并在@BeforeClass方法中初始化驱动程序。当你真的坚持使用驱动程序构造函数时,你必须创建自己的main方法来运行代码,但我想你将利用单元测试框架的优势。

另外,如果你想共享一个webdriver实例,请将其声明为静态。您将只读取此参数。因此,当您想要并行运行测试时,我不会发现问题。或者如果有一些p

答案 1 :(得分:0)

您的Page类中不需要构造函数。此外,您可以将其所有方法设置为静态,并了解它如何帮助减少许多代码行。

我们可以通过首先查看测试来轻松了解Page对象模型。以下是一个示例测试用例:

  • 转到登录页面
  • 输入用户名,密码并单击[提交]按钮
  • 等待主页加载并验证其中的内容,例如用户显示名称和菜单[Logout]存在

您可以编写许多其他案例,例如提交无效的用户名/密码。因此,您不希望重复代码来查找元素,键入或单击它。而是在Login页面类中编写方法。该类包含所有元素定位器,并提供与它们交互的方法。

这里我写了全静态页面类:

public class TestBase {
    public static WebDriver driver;
    @BeforeMethod
    public void init() {
        //create the driver here
    }
    @AfterMethod
    public void teardown() {
        //quit the driver here
    }
    public static pause(int millis) {
        //
    }
}
public class LoginPage extends TestBase {
    static By txtUsername = By.xpath("//form//input[@name='username']");
    public static fillUsername(String username) {
        WebElement e = driver.findElement(txtUsername);
        e.clear();
        e.sendKeys(username);
    }
    //other elements...
}
public class Home extends TestBase {
    // locators
    // methods to click, read data, test element presence, ...
}
public class Test1 extends TestBase {
    @Test
    public void testValidLogin() {
        driver.get("http://example.com");
        pause(5000);
        Login.fillUsername("user1");
        Login.fillPassword("secret");
        Login.clickSubmit();
        pause(5000);
        Home.testLogoutBtnPresent();
    }
}

在上面的代码中,驱动程序是静态的,并在@BeforeMethod中创建。您可能(但很少)需要创建不同的驱动程序实例。只要我的测试不需要并发会话,我将使用静态驱动程序。我个人觉得必须创建新的Page实例会导致更长的测试方法,并且会增加大量的思考时间(何时创建,我如何命名实例,是否可以重用实例)。