【问题标题】:Parallel execution using POM with PageFactory使用 POM 和 PageFactory 并行执行
【发布时间】:2016-05-19 07:05:50
【问题描述】:

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

public static WebDriver driver;

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

private WebDriver driver;

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

/* 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. 有什么办法可以优化这个吗?因为我有一个疑问是,如果我并行运行它们,非静态对象引用可能会被覆盖并导致其中一种方法出现问题。

对不起,如果我的问题是幼稚的。任何帮助将不胜感激。

【问题讨论】:

    标签: selenium selenium-webdriver testng


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我会调查的。
    【解决方案2】:

    这里我想给你一个页面对象模型的例子。希望你能把这个联系起来。

    我的主要测试:

    @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']"));
    

    现在支持类:

    GoToSignInPageForPropertyFile 方法将在 WebUtils 中 我在 Webutils 中编写的任何内容都将被每个页面对象类使用。

    例如

    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);
      }
    }
    

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

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

    Webutils 中会进一步介绍

    public class WebUtils {
        public static void Click(WebDriver driver, By by) {
            WebElement Element = driver.findElement(by);
            Element.click();
      }
    }
    

    【讨论】:

    • 是的。请回复以进行进一步查询。 :-)
    • Kishan 在并行执行方面,我在 Firefox 对象保留方面遇到了困难。假设我在 2 个类文件中并行运行测试用例(通过设置 parallel="tests")并且我在初始化单独类中的 firefox 驱动程序时使用 beforeclass/beforetest,那么如果 classA 中的测试用例完成然后它正在退出驱动程序(我知道为什么)并且不能用于 ClassB。我想要的是每个测试类的单独驱动程序实例。怎样才能使它成为可能,它是正确的方法吗? ........
    • 我能想到的唯一其他方法是将驱动程序初始化为@BeforeMethod...但是关闭和打开浏览器会消耗大量时间。请提出建议。
    • 它是什么类型的项目?马文?
    • 是的 Kishan,这是一个 maven 项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2017-04-01
    相关资源
    最近更新 更多