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

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

陈寒
2023-03-14

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

@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个答案

谢财
2023-03-14

这样如何,让您的标识符保持静态,然后从测试中调用传递它们。虽然我不会建议,因为测试可以改变标识符,很难理解为什么测试失败。

您的页面对象类

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类

于嘉许
2023-03-14
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 
public void Llogin()
{
 //initiate webdriver 
 //driver.get("url")
 Login_page.Textbox_UserName(driver).sendKeys("username")
}
颛孙英勋
2023-03-14

您可以使用以下内容:

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);
}
 类似资料:
  • 问题内容: 我正在遵循页面对象模型来自动化一个应用程序中的流程。在模块之一中,我必须声明页面标题和更多消息。截至目前,我将我的断言代码放在PageFactory本身中,如下所示: 我从实现TestNG的主文件中调用assert方法,如下所示: 目前,我正在通过3个程序包运行执行程序。浏览器工厂的“ Helper”软件包,PageFactories的“ Pages”软件包和Testcase的“ Te

  • 我正在使用Selenium为我的网站构建一个测试框架,我实际上希望您在使用页面对象模型时对良好实践的想法:让我们说,我有一个欢迎页面,其中包含一个注销按钮存在的标题,这个标题可以在大多数页面中看到在我的页面中,我认为最好为标题写一个单独的类,比如: 公共类欢迎页 我的问题是,你认为在欢迎页面中包含标题作为属性更好还是应该将它们分开? 让我们以注销测试方法的代码为例: 案例一: 案例2: 第二个问题

  • 是否有任何Gem(比如siteprism:用于Web自动化测试)可以在我的移动自动化测试项目中使用,以使用页面对象模型模式定义屏幕。 提前谢谢

  • 我正在使用Perl和Selenium构建一个测试自动化项目。我正在使用页面对象模型。我有点不确定Selenium驱动程序将适合页面对象模型的实现。 每个页面对象是否应该“有”一个驱动程序?我的想法是,每个页面对象代表页面向用户提供的一组服务。考虑到这个概念,页面对象与驱动程序没有“has-a”关系。页面对象与驱动程序交互。不过,我仍在寻求建议。我应该将驱动程序作为web应用程序中每个页面对象的一部

  • 第一次海报。我已经在UI自动化领域工作了很多年,但直到最近才被介绍/指示使用页面对象模型。其中大部分是常识,包括我已经使用过的技术,但是有一个特别好的点我还没有能够在我自己的头脑中证明,尽管我广泛地寻找一个合理的解释。我希望这里有人能启发我,因为当我试图将POM与我自己的最佳实践相结合时,这个问题已经引起了一些恐慌。 从http://code.google.com/p/selenium/wiki/

  • 我们如何等待IWebElement(重新)连接到DOM?我的场景是这样的,我从dropdown1中选择一个值,然后单击dropdown2上的数据绑定。所以当我的测试像从Dd1中选择“foo”,然后从Dd2中选择“bar”- 但是我真的不想把定位器字符串(“foo”)带到我的测试逻辑中,因为它似乎破坏了使用页面对象模型的意义。使用页面对象模型时,我已经有了IWebElement实例 那么,您知道隐式