如何使用selenium和java将应用程序的所有页面类的header、footer等可重复部分添加到页面对象模型中?

yx2lnoni  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(442)

我正在尝试使用selenium和java自动化web测试,
我有一个web应用程序,其中某些部分像页眉和页脚在多个页面上重复。我使用页面对象模型,为每个网页创建页面类文件。所有网页都有相同的页眉和页脚。
我已经创建了两个页面类文件,homepage.java和smallbusinesspage.java,以及两个单独的类文件,分别用于组件header和footer,header.java和footer.java。这些文件与页类文件位于不同的包中。我的测试类文件是testcasedevelopment.java,基类是testbase.java。我需要使用homepage对象从测试类testcasedevelopment.java访问头链接'enroll'(其定位器在header.java文件中)(主页包含headerhomepage定位器,可以在网页上查找整个标题。header.java文件中的linkenroll定位器定位头中的链接。所以链接的完整定位器是headerhomepage+linkenroll,意思是 //header//div[@id='masthead']//a[normalize-space()='Enroll'] 我无法访问它。
我不想在每个页面类文件中为页眉和页脚创建重复项。如何将这些节定义为单独的类文件,并将它们包含在页面类文件中?
主页.java

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****
    }
}
cig3rfwq

cig3rfwq1#

按照标准惯例,您必须创建一个名为 BaesPage.java 在整个应用程序中保留所有公共定位器。所有页面对象将扩展该类,以便所有公共定位器可用于所有页面对象。请看一看。
基本页.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中移动它们
主页.java

public class HomePage extends BasePage {

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

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

测试库.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();
    }
}

相关问题