使用POM与PageFactory并行执行

时间:2016-05-19 07:05:50

标签: selenium selenium-webdriver testng

当我使用WebDriver的静态对象引用并且并行运行测试时,我开始遇到问题。

public static WebDriver driver;

因此我决定对WebDriver使用非静态对象引用。

private WebDriver driver;

现在当我将POM与Page Factory一起使用时,我的理解是,每次创建测试时,我都必须在测试类中创建一个新的Object,如下所示。

  

/ * Page Object类* /

中的构造函数
private WebDriver driver;

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

2个测试用例如下所示。

private LoginPage loginPage;    

@Test
public void testCase1() {
    loginPage = new LoginPage(getDriver());
    loginPage.sendkeys("sometext");
}

@Test
public void testCase2() {
    loginPage = new LoginPage(getDriver());
    loginPage.sendkeys("sometext");
}

我的问题是

  1. 我是否正确为每个测试用例创建页面对象?
  2. 有什么办法可以优化吗?因为我得到的一个疑问是,如果我并行运行非静态对象引用可能会被覆盖并导致其中一种方法出现问题。
  3. 很抱歉,如果我的查询很天真。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您无需再次初始化它。另外,在@BeforeTest而不是在测试用例中初始化页面。

答案 1 :(得分:0)

这里我想举例说明Page对象模型。希望你能谈谈这个。

我的主要测试:

CurrentSelecton

现在支持班级:

GoToSignInPageForPropertyFile方法将在WebUtils中 无论我在Webutils中写什么,都会被每个页面对象类使用。

例如

@Before
public void SelectBrowser(){
    driver = WebUtils.SelectBrowser(driver,"Chrome");
}


@Test
public void LoginToGmail() throws InterruptedException{
    //WebDriver driver = new FirefoxDriver();
//MAximize the Screen
    driver.manage().window().maximize(); 
//Go to Gmail Login Page
    SignInPage SignInPage = new SignInPage();
    WebUtils.GoToSignInPageForPropertyFile(driver, "URL");
//Click on Next
    SignInPage.ClickToLogin(driver, By.cssSelector("input[id='next']"));

现在,ClickToLogin方法在SignInPage类下定义为:

public class WebUtils {

    public static pageobject.SignInPage GoToSignInPageForPropertyFile(WebDriver driver, String URL) {   
        ReadFileData File = new ReadFileData();
        Properties Values = File.ReadFile();
    driver.get(Values.getProperty("URL"));
    return PageFactory.initElements(driver, pageobject.SignInPage.class);
  }
}

这将进一步在Webutils

 public class SignInPage {
 public EmailViewPage ClickToLogin(WebDriver driver, By by) {
    WebUtils.Click(driver, by);
    return PageFactory.initElements(driver, EmailViewPage.class);
  }
}