2017年6月2日,星期五

鸦片 中的页面对象模型(POM)

在Appium中启动UI自动化并不是一项艰巨的任务。您只需要找到元素,对其执行操作。
小型Appiumunibet脚本的维护看起来很容易,但是需要时间unibet 套件将增长为多个unibet脚本。随着您向代码中添加越来越多的行, 变得难以维护。脚本维护的主要问题是 如果10个不同的脚本使用相同的移动元素,则进行任何更改 在该元素中,您需要更改所有10个脚本。这是时间 消耗和容易出错。
unibet脚本的更好方法 维护工作是创建一个单独的类文件,以查找移动设备 元素,填充或验证它们,这些元素可以在所有 使用该元素的脚本。将来,如果网络发生变化 元素,我们只需要在1个类文件而不是10个文件中进行更改 不同的unibet脚本。这种方法称为 页面对象模型(POM)。它有助于编写代码 更具可读性,可维护性 和   可重用的。

影片教学-

 

什么是POM?


1.页面对象模型是一种设计模式。
2.在此模型下,对于每个移动应用程序屏幕,应有相应的页面类别。
3.此Page类将找到该移动屏幕页面的MobileElements,并且还包含对这些MobileElements执行操作的Page方法。
4.这些方法的名称应根据它们正在执行的任务来给出,即,如果加载器正在等待登录页面出现,则POM方法名称可以是waitForLoginScreenDisplay()。

POM的优点


1.Page对象模型定义UI中的操作和unibet方案流应与验证分开。这个概念使代码更简洁,更易于理解。
2.第二个好处是对象存储库保持独立于unibet用例,因此我们可以将同一对象存储库用于不同的目的和使用不同的工具。例如,我们可以将POM与TestNG / JUnit集成在一起进行功能unibet,同时与JBehave / Cucumber集成进行验收unibet。
3.代码变得可重用和优化。


如何使用POM?



所需功能的核心类别相关设置-
 我们可以使用此类编写与核心设置相关的代码,这些代码对于执行每个Appiumunibet用例是通用的。


package com.example.anuja.appiumapplication;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;

import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;

/**
 * Created by Anuja on 6/2/2017.
 */

public class 基础Setup {

        private DesiredCapabilities capabilities = new DesiredCapabilities();
        private static AndroidDriver androidDriver = null;

        private String appiumPort;
        private String serverIp;

        @BeforeClass
        public void setup(){
             initDriver(); 
        }

        public AndroidDriver getDriver() {
            return androidDriver;
        }

        private void initDriver(){
            System.out.println("Inside initDriver method");

            DesiredCapabilities cap = new DesiredCapabilities();
            cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
            cap.setCapability(MobileCapabilityType.DEVICE_NAME, "Android device");
            cap.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, "4000");
            cap.setCapability(MobileCapabilityType.APP, "c://apks//listviewsample.apk");
            cap.setCapability("noReset", true);
            String serverUrl = "http://" + serverIp + ":" + appiumPort + "/wd/hub";


            try
            {
                System.out.println("Argument to driver object : " + serverUrl);
                androidDriver = new AndroidDriver(new URL(serverUrl), capabilities);

            }
            catch (NullPointerException | MalformedURLException ex) {
                throw new RuntimeException("appium driver could not be initialised for device ");
            }
            System.out.println("司机 in initdriver is : "+androidDriver);

        }

        @AfterClass
        public void tearDown(){
            androidDriver.quit();
        }

    }
司机 class -
此类实例化驱动程序对象。


import io.appium.java_client.android.AndroidDriver;

/**
 * Created by Anuja on 6/2/2017.
 */

public class 司机 extends 基础Setup{

    protected AndroidDriver driver;

    public 司机() {
        this.driver = super.getDriver();
    }
}
登录页面的页面类别-
这是我们的页面类的外观。

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;




/**
 * Created by Anuja on 5/17/2017.
 */

public class LoginPage extends 司机{

    PageObjects loginPage;

    String userName = "";
    String passWord = "";

    public LoginPage() {
        super();
        loginPage = new PageObjects();
        PageFactory.initElements(driver, loginPage);
    }

    public boolean validateLoginpage(){
        boolean elements = false;
        if(loginPage.userNameFld.isDisplayed()){
            if(loginPage.passwordField.isDisplayed()){
                if(loginPage.checkBox.isDisplayed()){
                    if(loginPage.loginBtn.isDisplayed()){
                        elements = true;
                    }
                }
            }
        }
        else{
            elements = false;
        }
        return elements;


    }

    public boolean testLoginWithoutCredentials() {
        boolean loginStatus = false;
        loginPage.loginBtn.click();
        if (loginPage.inputError.getText().equalsIgnoreCase("Username is mandatory")) {
            loginStatus = true;
        }
        loginPage.userNameFld.sendKeys(userName);
        loginPage.loginBtn.click();
        if (loginPage.inputError.getText().equalsIgnoreCase("Password is mandatory")) {
            loginStatus = true;
        }
        return loginStatus;

    }



    class PageObjects {

        @CacheLookup
        @FindBy(id = "et_username")
        public WebElement userNameFld;

        @CacheLookup
        @FindBy(id = "et_password")
        public WebElement passwordField;

        @CacheLookup
        @FindBy(id = "btnSignin")
        public WebElement loginBtn;

        @CacheLookup
        @FindBy(name = "Invalid ID or password.")
        public WebElement inputError;

        @CacheLookup
        @FindBy(id = "checkBox")
        public WebElement checkBox;


    }
}

用于编写登录页面unibet用例的unibet用例类- 
这就是我们的unibet用例的外观。

import org.junit.Test;

/**
 * Created by Anuja on 5/17/2017.
 */

public class LoginTests {

    @Test
    public void testLogin()
    {
        LoginPage loginPage = new LoginPage();
        if(loginPage.validateLoginpage() == true){
            loginPage.testLoginWithoutCredentials();
            System.out.println("pass");
        }
        else{
            System.out.println("Validation failed");
        }

    }
}
希望您喜欢这篇文章。请在下面的评论部分中分享您的查询和反馈,请在社交媒体上关注我,以获取最新的帖子更新。




32条评论:

  1. 你能为它制作视频吗?

    回复 删除
    回覆
    1. 是的,它在我的任务中。很快就会在YouTube频道上列出。
      订阅以获取通知:-)

      删除
    2. 最后一年的机器学习项目 最后一年的机器学习项目

      深度学习项目可帮助即将毕业的学生快速提高您应用的深度学习技能,同时使您能够研究一个有趣的观点。此外,您可以将最后一年的深度学习项目纳入您的投资组合,从而更轻松地获得职业,发现出色的职业空缺以及 最后一年的深度学习项目 甚至安排更大的赔偿。

      钦奈的Python培训 钦奈的Python培训 角度训练 钦奈的项目中心

      删除
  2. 嗨...能否请您告诉我如何运行以上示例

    回复 删除
  3. IP开发人员 2017年9月4日在05:17

    HI您可以制作一个有关运行示例的视频

    回复 删除
  4. 您可以发送listviewsample.apk的链接吗

    回复 删除
  5. 更多有趣的文章在这里:英格慕世代 互联网营销工具在这里: Zeageat IM

    回复 删除

  6. 我很想知道您正使用哪种博客系统?一世'我的最新网站和我遇到了一些小的安全问题'd想找到更安全的东西。你有什么建议? gmail.com登录

    回复 删除
  7. 你好
    I'm收到错误"方法setup()应该是静态的"。您如何避免这个问题?
    谢谢

    回复 删除
  8. 非常感谢您与我们分享这一有价值的内容。这里采用的概念将对我将来的程序很有用,我一定会在我的研究中实现它们。保持这样的博客文章。

    班加罗尔的硒培训|

    回复 删除
  9. 嗨Anuja,
    我尝试了您的解决方案,但由于驱动程序没有getnull指针异常't完全初始化。
    在调试时,"Driver"类从以下位置进入getDriver方法"Base" class
    但它'永远不会进入setup方法来调用initDriver来初始化驱动程序,那么如何初始化驱动程序?

    谢谢!

    回复 删除
    回覆
    1. 我有类似..的变化

      公开的AndroidDriver getDriver(){
      initDriver();
      返回androidDriver;
      }

      但寻找正确的解决方案。

      删除
  10. 我正在使用@Androidfindby,但unibet获胜't用intellijea初始化页面。有什么理由吗?

    回复 删除
  11. 该解决方案甚至不可能尽可能地起作用'甚至可以从静态方法访问非静态方法。 @BeforeClass依赖于静态方法。经典之一。

    回复 删除
  12. 你好

    问题是:在每次unibet之后,我应该退出驱动程序,然后在每次unibet之前再次对其进行初始化吗?

    这需要相当长的时间。
    如果我'我只是在每次unibet后关闭并在每次unibet工作更快之前启动应用程序,但是如果我有来自不同班级的unibet,则不会

    如果不需要,则在每次unibet后都关闭驱动程序。我们如何实现呢?您可以共享testng.xml文件吗?



    等待您的回应!

    谢谢!!

    回复 删除
  13. 嗨,我有一个查询,
    Why are you using 司机.java Class to access the driver object ?

    为什么可以'我们是否将驱动程序设为BaseSetup类中受保护的成员,并使用该Android驱动程序?

    回复 删除
  14. 请像这样更改所需功能

    私有DesiredCapabilities功能
    私有静态AndroidDriver androidDriver = null;

    以及initDriver()
    删除此DesiredCapabilities上限= new DesiredCapabilities();
    并替换为cap = new DesiredCapabilities();

    尝试块中的第三次更改

    androidDriver =新的AndroidDriver(新的URL(serverUrl),功能); -将功能更改为上限。

    它会工作

    回复 删除
  15. 巴特那的IIT JEE培训|巴特那IIT JEE研究所|在巴特那的NEET教练|巴特那的医疗教练| JEE Mains,巴特那的JEE高级培训|欧罗巴课程

    JEE Mains,巴特那的JEE高级培训
    亚马逊上的热门优惠]
    技术提示

    阿努什卡·森

    回复 删除
  16. 技巧技术

    每次学习新的技术提示

    嘿,观众们,在这个网站上,我们’会发布有关技术的许多技巧。关于黑客,教育和娱乐小众的许多技巧。一世’ll post somethin 技术提示
    g每天特别适合您
    所以从这里看看

    回复 删除
  17. 出售所有印地文产品

    Hindisales为您提供最高效的“要约”通知。如果您想为您购买任何产品。只需检查该商品的报价,然后从此处查看
    亚马逊上的热门优惠]

    回复 删除
  18. 阿努什卡·森(Anushka Sen): 她是印度的女演员。她很小的时候就担任过许多角色。他的载体的主要作用是 Balveer 作为Mehar。人民称他为印度的紫星。这段时间他的年龄约为17岁,她在他的表演载体中扮演大约三个重要角色。现在她正在研究Manikarnika(Jhansi ki Rani)。

    阿努什卡·森

    回复 删除
  19. 嗨,我们需要传递服务器IP和端口号的地方

    回复 删除
  20. 我喜欢您的文章,其中有很多关于软件unibet的信息,我想学习,谢谢您的出色指导。这篇文章非常有用,我认为从其他评论中也很容易看出这篇文章写得很好并且很有用。不久前,我将这个博客作为书签添加了书签,因为它的内容非常有用,我永远不会感到失望。保持良好的工作。.了解更多有关 质量检查服务

    回复 删除
  21. It'这是一篇非常有用的博客文章,内容有信息性和洞察力,我对这些信息有很好的经验。 CRS信息解决方案主页 真的很好。了解更多详情 关于我们 CRS信息解决方案。在这里您可以看到 课程CRS信息解决方案 完整列表。找到最好的 Hadoop培训 拥有出色的师资了解有关crs信息解决方案的信息 工作日培训 程序。

    回复 删除
  22. 感谢您分享本文。这是非常有价值的内容。希望这些评论列表对我的网站有所帮助
    工作日工作室在线培训
    最佳工作日工作室在线培训
    顶级工作日工作室在线培训

    回复 删除
  23. 感谢您分享本文。这是非常有价值的内容。希望这些评论列表对我的网站有所帮助
    最佳工作日在线培训

    回复 删除