编写Selenium页面对象模型框架的通用方法

时间:2017-03-24 08:26:05

标签: java selenium

我正在关注页面对象模型,其中我已经在页面中放置了所有WebElement地址和方法,例如id,xpath等。 示例:在登录页面上,我们有用户名字段,密码字段和登录按钮。所有这些都将在LoginPage.java上。此页面还包括使用Webelements的方法。所以从实际的测试用例来看,我只是调用页面上定义的方法。现在这是我的困境。我有几个测试步骤需要我点击一个元素。 所以说我需要点击Link1,Link2和Link3。现在我正在做的是为每个步骤编写一个单独的方法,并将它们保存在下面的页面上:

@FindBy(id = "someId1")
WebElement link1;

@FindBy(id = "someId2")
WebElement link2;


public void clickOnLink1(){
    link1.click();
}

public void clickOnLink2(){
    link2.click();
}

测试用例:

clickOnLink1();

clickOnLink2();

因此,如果我有50个步骤需要我点击50个不同的元素,我将需要50种不同的方法,这是非常不正确和低效的。我可以使用如下的通用方法:

public void clickOnElement(WebElement element) {
    element.click();
}

我可以将我想要点击的元素传递给这个方法,它会为我做。

不幸的是,正如我之前所说的那样,我正在关注页面对象模型,所以所有WebElement地址都像id一样存在于页面而不是测试用例上,因此我无法使用此方法,因为我需要从测试用例中传递webelement

有人可以用不同的方法帮助我。

谢谢

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

public class Login_Page {


@FindBy(id = "someId1")
WebElement link1;

@FindBy(id = "someId2")
WebElement link2;

//constructor
public Login_Page(driver) {
    PageFactory.initElements(driver, this);
}

//Generic Click method
public boolean genericClick(WebDriver driver, WebElement elementToBeClicked)
{

    try{

     elementToBeClicked.click();

     return true;
}
catch(Exception e){

     return false;
}

}

现在进入测试方法:

@Test 
public void LoginTest()
{
 Webdriver driver = new FirefoxDriver();
 driver.get("someurl")

 Login_Page lp = new Login_Page(driver);
 lp.genericClick(driver, lp.link1);
}

答案 1 :(得分:0)

public class Login_Page {


private static WebElement element = null;


//username
public static WebElement Textbox_UserName (WebDriver driver)
{

    element = driver.findElement(By.id("username"));

    return element;

}

现在,在Test Case方法中,只需调用:

@Test 
public void Llogin()
{
 //initiate webdriver 
 //driver.get("url")
 Login_page.Textbox_UserName(driver).sendKeys("username")
}

答案 2 :(得分:0)

如何做到这一点,使你的标识符静态,然后调用从测试中传递它们。虽然我不会建议,因为测试可以更改标识符,并且很难理解为什么测试失败。

您的网页对象类

public class GoogleSearch {
    @FindBy(name="q")
    static WebElement searchBox;
    public GoogleSearch(WebDriver driver){
        PageFactory.initElements(driver, this);
        driver.get("https://www.google.com");
    }
    public void enterText(WebElement element, String text){
        element.sendKeys(text);
    }
}

这就是测试类的样子

public class GoogleTest {

    WebDriver driver;
    @BeforeMethod
    public void setup(){
        driver = new FirefoxDriver();
    }

    @AfterMethod
    public void tearDown(){
        driver.quit();
    }

    @Test
    public void SearchOnGoogle(){

        GoogleSearch googleSearchPage = PageFactory.initElements(driver, GoogleSearch.class);
        googleSearchPage.enterText(GoogleSearch.searchBox, "selenium webdriver");

    }
}

要进一步优化,您可以在 BasePage 中使用此 enterText 方法,并且每个页面对象都可以扩展此 BasePage类