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

如何在selenium和Java的页面对象模型中添加应用程序所有页面类的页眉、页脚等可重复部分?

艾心远
2023-03-14

我正在尝试使用Selenium和JAVA实现web测试的自动化,

public class HomePage extends TestBase {

    @FindBy(xpath = "//header//div[@id='masthead']")
    public Header HeaderHomePage;

    public HomePage() {
        PageFactory.initElements(driver, this);
    }
}

SmallBusinessPage.java

public class SmallBusinessPage extends TestBase{

    @FindBy(xpath = "//header//div[@id='masthead']")
    public Header HeaderSmallBusiness;

    public SmallBusinessPage() {
        PageFactory.initElements(driver, this);
    }
}

标题

public class Header extends TestBase{

    @FindBy(xpath="//a[normalize-space()='Enroll']")
    WebElement LinkEnroll;

    public Header() {
        PageFactory.initElements(driver, this);
    }
}

页脚

public class Footer extends TestBase {

    @FindBy(xpath="//footer//a[text()='Careers']")
    public WebElement LinkCareers;

    public Footer() {
        PageFactory.initElements(driver, this);
    }
}
public class TestBase {

    public static WebDriver driver;
    public static Properties prop;
    Header header = new Header();

    public TestBase(){

        try {
            prop = new Properties();
            FileInputStream istream = new FileInputStream("C:\\QA -Selenium\\WS\\WellsFargoTest\\src\\main\\java\\com\\wellsfargo\\qa\\config\\config.properties");
            prop.load(istream);
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }

    public static void initialization() {
        String browserName = prop.getProperty("browser");
        if(browserName.equals("chrome")){
            System.setProperty("webdriver.chrome.driver","C:\\Selenium\\chromedriver");
            driver =new ChromeDriver();
        }
        if(browserName.equals("FF")){
            System.setProperty("webdriver.gecko.driver","C:\\Selenium\\geckodriver");
            driver = new FirefoxDriver();
        }
        driver.manage().window().maximize();
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().pageLoadTimeout(TestUtility.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);        
        driver.manage().timeouts().implicitlyWait(TestUtility.IMLICIT_WAIT, TimeUnit.SECONDS);  
        driver.get(prop.getProperty("url"));
    }
}
public class TestCaseDevelopment extends TestBase{

    HomePage homePage;
    public TestCaseDevelopment() {
        super();
    }

    @BeforeMethod
    public void setup() {
        initialization();
        homePage = new HomePage();
        ****homePage.HeaderHomePage.l****
    }
}

共有1个答案

毛越
2023-03-14

根据标准实践,您必须创建一个名为baespage.java的类,它保留整个应用程序的所有公共定位器。所有page对象都将扩展该类,因此所有公共定位器都可用于所有page对象。请看一下。

basePage.java

public class BasePage{

    @FindBy(xpath="//a[normalize-space()='Enroll']")
    WebElement LinkEnroll;


@FindBy(xpath="//footer//a[text()='Careers']")
    public WebElement LinkCareers;

    public BasePage() {
        PageFactory.initElements(driver, this);
    }
public void clickEnroll()
{

LinkEnroll.click();
}
}

现在,您不需要header.java和footer.java这两个单独的类,因为这两个类在应用程序中都有通用的定位器,所以它被移动到basepage.java中

public class HomePage extends BasePage {

    @FindBy(xpath = "//header//div[@id='masthead']")
    public Header HeaderHomePage;

    public HomePage() {
        PageFactory.initElements(driver, this);
    }
}

TestBase.java

public class TestBase {

    public static WebDriver driver;
    public static Properties prop;
    Header header = new Header();

    public TestBase(){

        try {
            prop = new Properties();
            FileInputStream istream = new FileInputStream("C:\\QA -Selenium\\WS\\WellsFargoTest\\src\\main\\java\\com\\wellsfargo\\qa\\config\\config.properties");
            prop.load(istream);
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }

    public static void initialization() {
        String browserName = prop.getProperty("browser");
        if(browserName.equals("chrome")){
            System.setProperty("webdriver.chrome.driver","C:\\Selenium\\chromedriver");
            driver =new ChromeDriver();
        }
        if(browserName.equals("FF")){
            System.setProperty("webdriver.gecko.driver","C:\\Selenium\\geckodriver");
            driver = new FirefoxDriver();
        }
        driver.manage().window().maximize();
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().pageLoadTimeout(TestUtility.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);        
        driver.manage().timeouts().implicitlyWait(TestUtility.IMLICIT_WAIT, TimeUnit.SECONDS);  
        driver.get(prop.getProperty("url"));
    }
}

测试案例开发

public class TestCaseDevelopment extends TestBase{

    HomePage homePage;
    public TestCaseDevelopment() {
        super();
    }

    @BeforeMethod
    public void setup() {
        initialization();
        homePage = new HomePage();
//Now you can call clickEnroll from any page object
        homePage.clickEnroll();
    }
}
 类似资料:
  • 问题内容: 如何使用itext从html源向pdf添加标头? 当前,我们扩展了PdfPageEventHelper并覆盖了这些方法。工作正常,但是当我进入2个以上页面时,它将引发RuntimeWorkerException。 问题答案: 通常, 禁止 在事件中添加内容。这是 禁止 添加内容到的对象。您应该使用而 不是 文档在方法中添加页眉和页脚。此外:通过一遍又一遍地解析HTML,您正在浪费大量C

  • 我正在尝试使用Selenium和C#实现web测试的自动化。 我有一个web应用程序,它的某些部分(如页眉和页脚)在多个页面上重复。 假设我有SecA,SecB,secc部分。在我的页面中,它将显示为第1页将有{SecA,SecB,SecC},第2页将有{SecA,SecB},第3页将有{SecB,SecC}。

  • 我正在开发一个Spring MVC应用程序,它将FreeMarker用于我的视图。 我对FreeMarker非常陌生,我有以下问题:在我的projct中,有3个文件必须被组装到一个页面中。 所以我有: 1) 标题。ftl表示我所有页面的标题,类似于: 2)footer.ftl代表我所有页面的页脚: 3) 然后我有了我的特定页面(名为myPage.ftl),它只表示内容,如下所示: 标题。ftl和页

  • 问题内容: 我真的不喜欢在每个控制器中编写代码: 是否可以这样做,将自动包含页眉和页脚,如果需要更改它,我们也可以这样做吗?你怎么处理?还是您认为这不是问题?谢谢。 问题答案: 这是我的工作: 对于CI 3.x: 然后,在您的控制器中,这就是您要做的一切:

  • 我花了一点时间试图找到一种方法来向添加一个标头,但没有成功。 这是我目前得到的: 似乎是处理项的对象。由于我找不到任何方法,所以我决定使用的方法,并在第一个位置添加header视图以充当header。 这就是事情变得更丑陋的地方: 在创建活动的不同时刻,尝试调用的几次(也尝试在设置好所有内容后添加视图,甚至适配器的数据)之后,我意识到我不知道这是否是正确的方法(而且看起来并不正确)。 PS:另外,