gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:23:14 24 4
gpt4 key购买 nike

我正在尝试使用 Selenium 和 JAVA 自动化 Web 测试,

我有一个 Web 应用程序,其中某些部分(如页眉和页脚)在多个页面中重复。我正在使用页面对象模型,为每个网页创建页面类文件。所有网页都有相同的页眉和页脚。

我创建了两个页面类文件 HomePage.java 和 SmallBusinessPage.java 以及用于组件页眉和页脚的两个单独的类文件 Header.java 和 Footer.java。这些文件与页面类文件位于单独的包中。我的测试类文件是TestCaseDevelopment.java,基类是TestBase.java。我需要使用 HomePage 对象从测试类 TestCaseDevelopment.java 访问标题链接“注册”(其定位器在 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****
}
}

最佳答案

根据标准做法,您必须创建一个名为 BaesPage.java 的类它保留了整个应用程序中的所有公共(public)定位器。所有页面对象都将扩展此类,因此所有常见定位器都可用于所有页面对象。请看一看。

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

Now you don’t need Header.java and Footer.java two separate classes as both have common locators across application so it is moved in BasePage.java



主页.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();
}
}

关于java - 如何使用 selenium 和 java 将应用程序的所有页面类的页眉、页脚等可重复部分添加到页面对象模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59901772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com