显示带有标签的帖子 鸦片. 显示所有帖子
显示带有标签的帖子 鸦片. 显示所有帖子

2018年6月4日,星期一

用Java代码启动Appium Server的最简单方法

在构建自动化框架时,执行端到端自动化(包括启动和停止appium服务器)非常重要。在这篇文章中牢记这一点,我将分享安装appium服务器并开始的最简单,最快的方法&使用简单的Java代码停止appium服务器。
这是使用Java代码以编程方式启动appium服务器的非常简单的方法。在我们的 上一教程 我们已经看到了如何使用Java代码来启动appium服务器 AppiumDriverLocalService 类。但是在本教程中,我们将看到安装appium服务器并使用简单的Java代码启动它的非常简单快捷的方法。


Step 1 > Install Node Js from  这里
 
Step 2 > Open Node Js Command Prompt as shown below.

Step 3 > Execute command npm install -g appium
 
Step 4 > Verify 鸦片 is Installed Successfully by executing command  appium -v
 
Step 5 > Start appium server using command appium -a 127.0.0.1 -p 4723
 
Step 6 > Do CTRL + C to stop ther server

Below is the Java Code to Start and Stop 鸦片 Server Programaticall. In the code we
are executing the command using java to start and stop the server.
Do try this out and post your feedback, Suggestion and questions in comment section 
below.



import java.io.IOException;

/**
 * 鸦片 Manager - this class contains method to start and stops appium server  
 */
public class 鸦片Manager {

 public void startServer() {
  Runtime runtime = Runtime.getRuntime();
  try {
   runtime.exec("cmd.exe /c start cmd.exe /k \"appium -a 127.0.0.1 -p 4725 --session-override -dc \"{\"\"noReset\"\": \"\"false\"\"}\"\"");
   Thread.sleep(10000);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void stopServer() {
  Runtime runtime = Runtime.getRuntime();
  try {
   runtime.exec("taskkill /F /IM node.exe");
   runtime.exec("taskkill /F /IM cmd.exe");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

2017年12月16日,星期六

如何使用Appium测试Toast消息?

我们不能直接使用Appium Client API测试Toast消息。因此,这里我们将在项目中导入Tess4j jar及其API,以从屏幕截图中读取Toast消息。一旦我们在屏幕上看到了文本,我们就可以通过各种断言来验证Appium测试用例中的Toast消息文本。

有关更多详细信息,请参阅此视频-


让我们看一下获取屏幕截图的代码,然后从屏幕截图中读取文本。



package com.appium.xample;



import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.LoadLibs;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;

import io.appium.java_client.android.AndroidDriver;

public class ReadToastMessage {
 
  static String scrShotDir = "screenshots";
  File scrFile;
  static File scrShotDirPath = new java.io.File("./"+ scrShotDir+ "//");
  String destFile;
  static AndroidDriver driver = null;
 
 public String readToastMessage() throws TesseractException {
  String imgName = takeScreenShot();
  String result = null;
  File imageFile = new File(scrShotDirPath, imgName);
  System.out.println("Image name is :" + imageFile.toString());
  ITesseract instance = new Tesseract();

  File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Extracts
                   // Tessdata
                   // folder
                   // from
                   // referenced
                   // tess4j
                   // jar
                   // for
                   // language
                   // support
  instance.setDatapath(tessDataFolder.getAbsolutePath()); // sets tessData
                // path

  result = instance.doOCR(imageFile);
  System.out.println(result);
  return result;
 }

 /**
  * Takes screenshot of active screen
  * 
  * @return ImageFileName
  */
 public String takeScreenShot() {
  File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); 
  
  SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy__hh_mm_ssaa");
  new File(scrShotDir).mkdirs(); // Create folder under project with name
          // "screenshots" if doesn't exist
  destFile = dateFormat.format(new Date()) + ".png"; // Set file name
               // using current
               // date time.
  try {
   FileUtils.copyFile(scrFile, new File(scrShotDir + "/" + destFile)); // Copy
                    // paste
                    // file
                    // at
                    // destination
                    // folder
                    // location
  } catch (IOException e) {
   System.out.println("Image not transfered to screenshot folder");
   e.printStackTrace();
  }
  return destFile;
 }
}

2017年10月7日,星期六

使用Appium向右,向左,向上和向下滑动

对于那些学习Appium的人来说,这是非常有用的教程,因为几乎所有移动应用程序都经常使用滑动和滚动。因此,学习使用Appium来实现自动化将帮助您编写测试代码。以下是我编写了不同功能的代码,这些代码用于使用Appium从上到下,从下到上,从左到右,从右到左滑动。我们可以在测试用例中使用所有这些方法来执行所需的操作。另外,我还创建了带有详细说明的视频教程。



/**
  /* Method to swipe screen from Bottom to Top (Vertical) Get the size of
  * screen. Find swipe start and end point from screen's width and height.
  * Find starty point which is at bottom side of screen. Find endy point
  * which is at top side of screen. Find horizontal point where you wants to
  * swipe. It is in middle of screen width.
  * Time duration should be in milliseconds
  */

 public void bottomTopswipe(int timeduration) {

  
  size = driver.manage().window().getSize();
  System.out.println(size);
  starty = (int) (size.height * 0.50);
  endy = (int) (size.height * 0.20);
  startx = size.width / 2;
  System.out.println("Start swipe operation");
  driver.swipe(startx, starty, startx, endy, timeduration);

 }

 /**
  * 
  * Method to swipe screen from Top to Bottom (Vertical) Get the size of
  * screen. Find swipe start and end point from screen's width and height.
  * Find starty point which is at bottom side of screen. Find endy point
  * which is at top side of screen. Find horizontal point where you wants to
  * swipe. It is in middle of screen width. 
         * Time duration should be in milliseconds
   */

 public void topBottomswipe(int timeduration) {

  
  size = driver.manage().window().getSize();
  System.out.println(size);
  starty = (int) (size.height * 0.50);
  endy = (int) (size.height * 0.20);
  startx = size.width / 2;
  System.out.println("Start swipe operation");
  driver.swipe(startx, endy, startx, starty, timeduration);

 }

 /**
  * 
  * Method to swipe screen from right to left (Horizontal) duration should be
  * in milliseconds Get the size of screen. Find swipe start and end point
  * from screen's width and height. Find startx point which is at right side
  * of screen. Find endx point which is at left side of screen. Find vertical
  * point where you wants to swipe. It is in middle of screen height. 
         * Time duration should be in milliseconds
   */

 public void rightLeftSwipe(int timeduration) {

  size = driver.manage().window().getSize();
  System.out.println(size);
  startx = (int) (size.width * 0.70);
  endx = (int) (size.width * 0.30);
  starty = size.height / 2;
  System.out.println("Start swipe operation");
  driver.swipe(startx, starty, endx, starty, timeduration);

 }

 /**
  * 
  * Method to swipe screen from left to right (Horizontal) duration should be
  * in milliseconds Get the size of screen. Find swipe start and end point
  * from screen's width and height. Find startx point which is at right side
  * of screen. Find endx point which is at left side of screen. Find vertical
  * point where you wants to swipe. It is in middle of screen height. 
         * Time duration should be in milliseconds
      */

 public void leftRightSwipe(int timeduration) {
  // duration should be in milliseconds
  size = driver.manage().window().getSize();
  System.out.println(size);
  startx = (int) (size.width * 0.70);
  endx = (int) (size.width * 0.30);
  starty = size.height / 2;
  System.out.println("Start swipe operation");
  driver.swipe(endx, starty, startx, starty, timeduration);

 }

2017年6月2日,星期五

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

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

影片教学-

 

什么是POM?


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

POM的优点


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


如何使用POM?



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


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 BaseSetup {

        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("Driver in initdriver is : "+androidDriver);

        }

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

    }
驾驶舱-
此类实例化驱动程序对象。


import io.appium.java_client.android.AndroidDriver;

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

public class Driver extends BaseSetup{

    protected AndroidDriver driver;

    public Driver() {
        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 Driver{

    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;


    }
}

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

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

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




2017年1月5日,星期四

如何在Appium测试中处理应用程序权限弹出窗口

我们已经遇到了棉花糖Android设备的问题,该应用会显示权限弹出窗口,要求用户允许或拒绝。要在我们的自动化测试用例中处理此问题。所以这篇文章将解释我们如何用简单的代码来处理这个问题。
考虑一下我们有一个移动应用程序,该应用程序在启动时要求所有必需的权限,并且每次它显示应用程序权限弹出窗口时,我们都需要单击允许按钮。


查看下面我们在其中调用的测试用例示例 allowAppPermission() 单击每个应用程序权限弹出窗口的方法。让我们看看该方法内部如何工作。在此方法中,我们添加了一个while循环,直到获得“允许应用程序许可”按钮。为了找到允许按钮,我们使用了最新的Appium Java客户端提供的MobileBy api。

影片教学-

 




import java.net.MalformedURLException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;



public class WaitTests {

 WebDriver driver;

 @Before
 public void setUp() throws MalformedURLException {
  
  DesiredCapabilities capabilities = new DesiredCapabilities();
  capabilities.setCapability("deviceName", "XT1562");
  capabilities.setCapability(CapabilityType.BROWSER_NAME, "Android");
  capabilities.setCapability(CapabilityType.VERSION, "6.0.1");
  capabilities.setCapability("platformName", "Android");
  driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
  driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
  
  
 }

 @Test
 public void testFirst() {
  
   alllowAppPermission();
   driver.findElement(By.name("Login")).click();
   driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); 
}

@After
 public void End() {
  driver.quit();
 }
public void allowAppPermission(){
 while (driver.findElements(MobileBy.xpath("//*[@class='android.widget.Button'][2]")).size()>0) 

 {  driver.findElement(MobileBy.xpath("//*[@class='android.widget.Button'][2]")).click();
 }
}
 

}

希望这个对你有帮助。请在下面的评论部分中分享您的反馈,并在社交媒体上关注我,以获取最新的帖子更新。

2017年1月3日,星期二

詹金斯的Appium和Maven项目

影片教学-

詹金斯介绍

詹金斯 是由以下公司开发的领先的开源持​​续集成工具 哈德逊实验室。它是跨平台的,可以在Windows,Linux,Mac上使用 OS和Solaris环境。 詹金斯用Java编程编写 语言。Jenkins是一个功能强大的应用程序,它允许连续 整合和持续交付项目,无论 您正在使用的平台。您可以将Jenkins与许多 测试和部署技术。在本教程中,我们将学习 詹金斯与Maven项目

詹金斯的重要特征

1. 詹金斯生成在诸如SVN,Github之类的存储库中完成的所有更改的列表。
2.Jenkins提供了指向最新版本或失败版本的直接链接,可用于轻松通信。
3. 詹金斯易于使用直接安装文件(exe)安装。
4.可以配置Jenkins通过电子邮件发送构建状态的内容。
5.在Jenkins上配置各种任务很容易。
6.可以将Jenkins配置为在每次构建后在TestNG上运行自动化测试构建。
7.可以将Jenkins配置为在多台计算机上分发构建。
8.可以在Jenkins中配置3rd party插件以使用功能和其他功能。

为什么选择詹金斯和阿皮姆?

1.在Jenkins中运行Appium测试可以使您每次软件更改时都运行测试。
2. 詹金斯可以安排您的测试在特定时间运行,这对于每个构建的回归测试执行都是有利的。
3.您可以保存执行历史报告和测试结果报告。
4. 詹金斯支持Maven以持续集成的方式构建和测试项目。

詹金斯安装


1.首先从下载Jenkins 这里.
2.安装Jenkins。

安装詹金斯

3.一旦安装打开 浏览器中的http:// localhost:8080 /网址。

安装詹金斯

4.然后导航到路径并输入密码,然后单击继续。

安装詹金斯

5.单击管理詹金斯



6.单击管理插件

7.搜索“ Maven集成插件”,然后选择 无需重新安装即可安装 选项。

8. Maven安装成功后,我们可以在添加新项的同时获取Maven项目。

9.转到新项目-> Enter The Name ->选择Maven项目-> Click OK

詹尼克斯·阿皮姆·玛文


10.向下滚动进行构建,您会发现Jenkins想知道您的Maven的安装位置。然后单击工具配置。
詹尼克斯·阿皮姆·玛文

11.然后添加您的jdk路径和maven路径。

詹尼克斯·阿皮姆·玛文
12.在构建Root POM中,给您的项目pom.xml路径。
詹尼克斯·阿皮姆·玛文

13.保存更改,然后单击立即构建。

詹尼克斯·阿皮姆·玛文 
14.构建完成后,您可以检查构建历史记录。