Как настроить структуру POM с помощью selenium java и (TestNG Framework)

Я новичок в автоматизации QA и имею средние знания в java, поэтому решил использовать (Selenium+Java) для автоматизации. Я прикреплю код, который я сделал, к автоматизации. И скрипт работает без сбоев. Но структура, которую я сделал, неверна, поскольку я хочу следовать модели (POM-Selenium).POM-Page Oriented.

Этот скрипт перемещается следующим образом

Логин(Страница)-->Персональный(Перетаскивание/выбор вниз)--->ДобавитьEdit((Перетаскивание/выбор вниз))-->Личный(Страница)-->Добавить(Кнопка)-->ЛичныеДетали(Страница)

Тестовый сценарий.......

пользователь должен «войти» в систему и щелкнуть раскрывающийся список «личные» на вкладке навигации, после чего появится раскрывающийся список «Добавитьредактирование». следует нажать кнопку «Добавить» на этой странице, чтобы перейти на другую страницу под названием «Личные данные». Пользователь может добавить соответствующие поля, которые предоставляются на странице, чтобы добавить нового клиента.

Пожалуйста, помогите мне упорядочить это в структуре POM. Потому что мне очень трудно думать, как это происходит. Что меня расстраивает, так это то, что пользователь может добавить соответствующую запись, он / она должен войти в систему и в POM. говорит, что вход в систему - это отдельная страница, мне нужно пройти через три страницы, чтобы выполнить задачу. было бы здорово, если бы вы могли мне помочь. и она открыта для обсуждения, и извините, если мой английский плохой. и, пожалуйста, считайте меня полным нубом, когда дело доходит до автоматизации :) спасибо!

Это тестовый сценарий, который я написал...

package TestNG;

import java.util.Iterator;
import java.util.List;

import javax.swing.JOptionPane;

import org.openqa.selenium.*;
import org.openqa.selenium.By.ByXPath;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.*;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.Test;

//public String baseUrl;
//public  String driverPath;
//public WebDriver driver;

public class Tester {
    public String baseUrl = "http://xxx.xxx.xxx.xxx:xxxx/xxx/";
    public String driverPath = "C:\\Users\\User\\Desktop\\geckodriver.exe";
    public WebDriver driver;

    @Test(priority = 0)
    public void Login() {

        System.out.println("launching firefox browser");
        System.setProperty("webdriver.gecko.driver", driverPath);
        driver = new FirefoxDriver();
        driver.get(baseUrl);
        WebElement username = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"userId\"]")));
        username.sendKeys("xxxxxxxxx");
        WebElement password = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"loginPassword\"]")));
        password.sendKeys("xxxxxxxxxxxxxxxxxx");
        WebElement button = (new WebDriverWait(driver, 10)).until(ExpectedConditions
                .presenceOfElementLocated(By.xpath("/html/body/div/div[3]/div/div/form/div[3]/div[2]/div/button")));
        button.click();
        String expectedTitle = "xxxxxxxxxxxxxxxxxxxxxxxx";
        String actualTitle = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/div[2]/div[2]/div/div/h1")))
                .getText().toString();
        // System.out.println(actualTitle);
        Assert.assertEquals(actualTitle, expectedTitle);

        // driver.close();

    }

    @Test(priority = 1)
    public void Personal_Tab_Selection() {

        clickWhenReady("/html/body/div[2]/div[2]/nav/div/div[2]/div/div[1]/ul/li[5]/a", 10, driver);

    }

    @Test(priority = 2)
    public void Add_Edit_Selection() {

        clickLinkByHref("/rsa/5/15/staff/n/i/list", driver);

    }

    @Test(priority = 3)
    public void Add_Button() {
        clickWhenReady("/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/a", 10, driver);

    }

    @Test(priority = 4)
    public void Radio_Button_AMW() {
        WebElement amw_radio = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[1]/div/div/label[1]")));
        amw_radio.click();
    }

    @Test(priority = 5)
    public void Radio_Button_service_provider() {
        WebElement service_provider = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[2]/div/div/label[1]")));
        service_provider.click();

    }

    @Test(priority = 6)
    public void Service_Provider_Name_select() {

        WebElement Service_Provider_DD = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(
                        By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[3]/div/div/a")));
        Service_Provider_DD.click();

        driver.findElement(By.cssSelector("ul > li:nth-child(2)")).click();

    }

    @Test(priority = 7)
    public void Employee_Code_Enter() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[5]/div/input"))
                .sendKeys("01112");

    }

    @Test(priority = 8)
    public void Click_Salutation() {
        WebElement Salutation_DD = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/a")));
        Salutation_DD.click();
    }

    @Test(priority = 9)
    public void Salutation_Click() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/div/ul/li[5]"))
                .click();

    }

    @Test(priority = 10)
    public void employee_name() {

        WebElement empname = driver
                .findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[7]/div/input"));
        empname.sendKeys("Test2");
    }

    @Test(priority = 11)
    public void Sap_plant_code() {
        WebElement plant_code = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/a")));
        plant_code.click();

    }

    @Test(priority = 12)
    public void sap_code_set() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/div/ul/li[3]"))
                .click();

    }

    @Test(priority = 13)
    public void sap_vendor_code() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[9]/div/input"))
                .sendKeys("test_2");

    }

    @Test(priority = 14)
    public void employee_role_select() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/ul")).click();

    }

    @Test(priority = 15)
    public void select_Technician_role() {

        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/div/ul/li"))
                .click();

    }

    @Test(priority = 16)
    public void select_status() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/a")).click();
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/div/ul/li[1]"))
                .click();

    }

    @Test(priority = 17)
    public void click_save_button() {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/button[1]")).click();

    }

    @Test(priority = 18)
    public void Record_add_notification_Check() {

        if ((new WebDriverWait(driver, 10)).until(ExpectedConditions
                .presenceOfElementLocated(By.xpath("/html/body/div[2]/div[3]/div/div/button"))) != null) {
            driver.findElement(By.xpath("/html/body/div[2]/div[3]/div/div/button")).click();
        } else {
            infoBox("not Added", "Not Added");
        }

    }

    public static void infoBox(String infoMessage, String titleBar) {
        JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE);
    }

    public static void clickWhenReady(String location, int timeout, WebDriver driver) {

        WebElement element = null;

        WebDriverWait wait = new WebDriverWait(driver, timeout);

        element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(location)));

        element.click();

    }

    public static void clickLinkByHref(String href, WebDriver driver) {

        List<WebElement> anchors = driver.findElements(By.tagName("a"));

        Iterator<WebElement> i = anchors.iterator();

        while (i.hasNext()) {
            WebElement anchor = i.next();
            if (anchor.getAttribute("href").contains(href)) {
                anchor.click();

                break;
            }

        }

    }

}

person Avishka Perera    schedule 26.04.2017    source источник


Ответы (2)


Несколько слов о вашем скрипте:

  1. presenceOfElementLocated(By.xpath("//*[@id=\"userId\"]")) - Если у элемента есть id, вы всегда должны пытаться использовать id вместо xpath

  2. By.xpath("/html/body/div/div[3]/div/div/form/div[3]/div[2]/div/button")) - рекомендуется использовать logical xpath вместо absolute xpath как можно чаще. В противном случае ваш xpath станет уязвимым.

  3. Теперь, когда вы хотите следовать POM, вам нужно определить все элементы страницы на одной странице, которая будет называться PageFactory. Точно так же все элементы веб-страницы будут находиться в отдельном классе.

Например, запись для элемента на веб-странице может выглядеть так:

@FindBy(id="user_login") 
WebElement username;
  1. Поскольку вы используете TestNG, вы можете переместить код, связанный с браузером, в отдельный класс Browserfactory. Из вашего тестового класса в @BeforeTest Annotation вызовите методы Browserfactory для инициализации браузера, откройте URL-адрес.

Это некоторые из основных шагов для реализации вашего кода через POM.

Дайте мне знать, если это решит ваш запрос.

person DebanjanB    schedule 26.04.2017
comment
Спасибо, Дев. В данный момент я занимаюсь этим, и я очень ценю ваш ответ. Я загружу структурированный код pom, когда закончу. И ответ очень полезен. Спасибо! - person Avishka Perera; 26.04.2017
comment
@VaasPerera Я рад, что могу вам помочь. Сказав это, я скажу, что в POM есть еще кое-что, что я буду постепенно предлагать вам для повторного использования кода и повышения производительности. Спасибо - person DebanjanB; 26.04.2017
comment
Спасибо, Дев! Я загружу свой код, как только закончу это :), чтобы вы могли изучить и дать мне отзыв. Для меня проще написать код в одном файле и запустить, чем следовать POM, потому что мне приходится иметь дело с более сложными сценариями, такими как метод перегрузка и переопределение, так как теперь я рефакторинг структуры POM своего кода, когда я повторно использую код, я должен думать и разрабатывать методы, которые работали нормально, когда он был в одном файле, и как он должен работать в POM. для меня ... но мне нужно руководство, пожалуйста, загрузите как можно скорее :) - person Avishka Perera; 26.04.2017

Это классы, которые я создал в зависимости от страниц пользовательского интерфейса, я также прикреплю структуру как снимок :) Структура затмения

public class Driver_class {

    private static String baseUrl;
    private static String driverPath;
    public static WebDriver driver;

    public static WebDriver getDriver() {

        baseUrl = "http://xxx.xxx.xxx.xxx:xx:xx\\Desktop\\geckodriver.exe";

        if (driver == null) {
            System.setProperty("webdriver.gecko.driver", "C:\\Users\\User\\Desktop\\geckodriver.exe");
            driver = new FirefoxDriver();
            driver.get(baseUrl);
        }
        return driver;

    }

}


public class Login {

    public WebElement uid;
    public WebElement pwd;
    public WebElement loginbtn;

    public void get_elements(WebDriver driver) {
        uid = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"userId\"]")));

        pwd = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"loginPassword\"]")));

        loginbtn = (new WebDriverWait(driver, 10)).until(ExpectedConditions
                .presenceOfElementLocated(By.xpath("/html/body/div/div[3]/div/div/form/div[3]/div[2]/div/button")));

    }

    public void customerLogin() {

        this.uid.sendKeys("xxxxxxxx");
        this.pwd.sendKeys("xxxxxxxxxxx");
        this.loginbtn.click();

    }

}

public class Navigation {

    public WebElement Personal_Tab;
    public WebElement Add_Edit_p;

    public void navigate_personal_button(WebDriver driver) {

        clickWhenReady("/html/body/div[2]/div[2]/nav/div/div[2]/div/div[1]/ul/li[5]/a", 10, driver);

    }

    public void navigate_personal_add_button(WebDriver driver) {

        clickLinkByHref("/rsa/5/15/staff/n/i/list", driver);


    }

    public static void clickWhenReady(String location, int timeout, WebDriver driver) {

        WebElement element = null;

        WebDriverWait wait = new WebDriverWait(driver, timeout);

        element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(location)));

        element.click();

    }

    public void clickLinkByHref(String href, WebDriver driver) {

        List<WebElement> anchors = driver.findElements(By.tagName("a"));
        Iterator<WebElement> i = anchors.iterator();

        while (i.hasNext()) {
            WebElement anchor = i.next();
            if (anchor.getAttribute("href").contains(href)) {
                anchor.click();
                break;
            }
        }
    }




}
public class Personal_Details {

    WebElement amw_radio;
    WebElement service_provider;
    WebElement Service_Provider_DD;
    //WebElement Employee_Code_Enter;

    WebElement Click_Salutation;
    WebElement Salutation_DD;
    WebElement empname;
    WebElement plant_code;


    //WebElement

    public void Radio_Button_AMW(WebDriver driver) {
         amw_radio = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[1]/div/div/label[1]")));
        amw_radio.click();
    }


    public void Radio_Button_service_provider(WebDriver driver) {
        service_provider = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[2]/div/div/label[1]")));
        service_provider.click();
    }


    public void Service_Provider_Name_select(WebDriver driver) {

        Service_Provider_DD = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.presenceOfElementLocated(
                        By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[3]/div/div/a")));
        Service_Provider_DD.click();

        driver.findElement(By.cssSelector("ul > li:nth-child(2)")).click();

    }


    public void Employee_Code_Enter(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[5]/div/input"))
                .sendKeys("01112");

    }


    public void Click_Salutation(WebDriver driver) {
        Salutation_DD = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/a")));
        Salutation_DD.click();
    }


    public void Salutation_Click(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[6]/div/div/div/ul/li[5]"))
                .click();

    }


    public void employee_name(WebDriver driver) {

         empname = driver
                .findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[7]/div/input"));
        empname.sendKeys("Test2");
    }


    public void Sap_plant_code(WebDriver driver) {
        plant_code = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/a")));
        plant_code.click();

    }


    public void sap_code_set(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[8]/div/div/div/ul/li[3]"))
                .click();

    }


    public void sap_vendor_code(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[9]/div/input"))
                .sendKeys("test_2");

    }


    public void employee_role_select(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/ul")).click();

    }


    public void select_Technician_role(WebDriver driver) {

        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[10]/div/div/div/ul/li"))
                .click();

    }


    public void select_status(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/a")).click();
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[1]/div[11]/div/div/div/ul/li[1]"))
                .click();

    }


    public void click_save_button(WebDriver driver) {
        driver.findElement(By.xpath("/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/button[1]")).click();

    }


    public void Record_add_notification_Check(WebDriver driver) {

        if ((new WebDriverWait(driver, 10)).until(ExpectedConditions
                .presenceOfElementLocated(By.xpath("/html/body/div[2]/div[3]/div/div/button"))) != null) {
            driver.findElement(By.xpath("/html/body/div[2]/div[3]/div/div/button")).click();
        } else {
            infoBox("not Added", "Not Added");
        }

    }

    public static void infoBox(String infoMessage, String titleBar) {
        JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE);
    }


}


public class Personal_list {

    WebElement add_btn;


    public void find_add_btn(WebDriver driver) {

          String add_btn_path = "/html/body/div[2]/div[2]/div/div[2]/form/div[2]/div/div/a";    
          detect_element_click(driver, add_btn_path);


    }

    public void detect_element_click(WebDriver webDriver, String xp) {
        WebDriverWait wait = new WebDriverWait(webDriver, 10);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xp))).click();

    }
}

Это TestCaseClass, который выполняет все тестовые случаи.

public class TestCases {

    public WebDriver driver = Driver_class.getDriver();

    @Test(priority = 0)
    public void newCustomerLogin() {

        Login rsaLogin = PageFactory.initElements(driver, Login.class);
        rsaLogin.get_elements(driver);
        rsaLogin.customerLogin();

    }

    @Test(priority = 1)
    public void click_Personal_tab() {

        Navigation n = PageFactory.initElements(driver, Navigation.class);
        n.navigate_personal_button(driver);
        n.navigate_personal_add_button(driver);


    }

    @Test(priority=2)
    public void click_add_tab() {

        Personal_list ps= PageFactory.initElements(driver,Personal_list.class);
        ps.find_add_btn(driver);


    }

    @Test(priority=3)
    public void Enter_personal_details(){

        Personal_Details d= new Personal_Details();
        d.Radio_Button_AMW(driver);
        d.Radio_Button_service_provider(driver);
        d.Service_Provider_Name_select(driver);
        d.Employee_Code_Enter(driver);
        d.Click_Salutation(driver);
        d.Salutation_Click(driver);
        d.employee_name(driver);
        d.Sap_plant_code(driver);
        d.sap_code_set(driver);
        d.sap_vendor_code(driver);
        d.employee_role_select(driver);
        d.select_Technician_role(driver);
        d.select_status(driver);
        d.click_save_button(driver);
        d.Record_add_notification_Check(driver);






    }

}
person Avishka Perera    schedule 26.04.2017