在Appium中启动UI自动化不是一项艰巨的任务。您只需要找到元素,请执行此操作。
一个小的Appium测试脚本维护看起来很容易,但随着时间的测试
套件将成长为多个测试脚本。当您为代码中添加越来越多的行
变得难以维持。脚本维护的主要问题是那个
如果10种不同的脚本正在使用相同的移动元素,则具有任何更改
在该元素中,您需要更改所有10个脚本。这是时间
消耗和易于出错。
一种更好的测试脚本方法
维护是创建一个单独的类文件,该文件将找到移动
元素,填写它们或验证它们可以在所有内部重用
使用该元素的脚本。在将来,如果网络有变化
元素,我们需要在仅为1级文件中进行更改而不是10
不同的测试脚本。这个方法被称为 页面对象模型(POM)。它有助于制作代码 更可读,可维护 , 和 可重复使用的。
视频教程 -
什么是pom?
1.页面对象模型是一种设计模式。
2.在此模型下,对于每个移动应用程序屏幕,应该有相应的页面类。
3.此页面类将找到该移动屏幕页面的MobileSement,还包含页面方法,该方法对这些手机执行操作。
4.应根据它们执行的任务给出这些方法的名称,即,如果加载程序正在等待出现登录页面,则POM方法名称可以是WaitForLoginscreendisplay()。
POM的优点
1.Page对象模型定义了UI中的操作和测试场景流程应与验证分开。这个概念使代码清洁器更容易理解。
2.第二个好处是对象存储库保持独立于测试用例,因此我们可以使用不同的目的和不同的工具使用相同的对象存储库。例如,我们可以将POM与Testng / Junit集成为功能测试,同时使用JBehave / Cucumber进行验收测试。
3.可重复使用和优化。
如何使用pom?
所需功能的核心类相关设置 -
此类我们可以用来编写核心设置相关代码,该代码是用于执行每个Appium测试用例的常见。
司机 class -
此类要实例化驱动程序对象。
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(); } }
此类要实例化驱动程序对象。
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; } }
用于编写登录页面测试用例的测试用例类 -
这就是我们的测试案例如何看待。
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"); } } }
我希望你喜欢这篇文章。请在下面的评论部分中分享您的查询和反馈,请在社交媒体上关注我的最新介质更新。
你能为它制作视频吗?
回复 删除是的,它在我的任务中..列出了很快它将在YouTube频道上。
删除订阅收到通知:-)
好的thx xd.
删除最终一年的机器学习项目 最终一年的机器学习项目
删除深度学习项目协助最后一年的学生在允许您调查有趣点时迅速提高应用深度学习技巧。此外,您可以将最后一年的深度学习项目包含在您的投资组合中,使其更加努力获得职业,发现酷派职业开放以及 最后一年的深度学习项目 甚至安排更加重要的补偿。
钦奈的Python培训 钦奈的Python培训 角训练 钦奈项目中心
嗨...能否告诉我如何运行上面的例子
回复 删除嗨,你可以在运行这个例子上进行视频吗?
回复 删除请您发送ListViewSample.apk的链接
回复 删除更有趣的文章在这里:一代Enggelmundus. 互联网营销工具在这里: Zeaeat Im.
回复 删除
回复 删除我很想找到你碰巧使用的博客系统?一世'm遇到我的最新网站和我的一些小安全问题'd想找到更安全的东西。你有什么建议? gmail.com登录
你好,
回复 删除I'm接收错误"方法设置()应该是静态的"。你如何避免这个问题?
谢谢
非常感谢您与我们共享这个值得的内容。这里采取的概念对于我未来的计划有用,我肯定会在我的研究中实施它们。保持像这样的博客文章。
回复 删除班加罗尔的硒培训|
嗨Anuja,
回复 删除我尝试了你的解决方案,但由于司机没有,getNull指针异常'T根本初始化。
在调试时,"Driver"类从中进入getdriver方法"Base" class
但它'从未进入设置方法调用init driver初始化,因此驱动程序将如何初始化?
谢谢!
我有变化..
删除公共androiddriver getdriver(){
initDriver();
返回Androiddriver;
}
但寻找正确的修复。
我正在使用@androidfindby,但测试赢了't初始化Intellijea中的页面。任何原因吗?
回复 删除甚至不可能让这个解决方案尽可能地工作'甚至从静态方法访问非静态方法。 @BeforeClass取决于静态方法。经典一。
回复 删除很不错 博客 更新 保持 更新 !
回复 删除非常丰富的博客
回复 删除金奈软件测试培训
好贴..
回复 删除硒培训中心在BTM
BTM中的最佳软件测试培训机构与展示位置
BTM中的自动化测试课程
BTM中的硒检测课程
BTM中的软件测试机构
BTM中的硒培训
BTM中最好的硒培训
BTM中的硒课程
好信息
回复 删除Marathahalli的硒培训中心
Marathahalli的最佳软件测试培训机构与展示位置
Marathahalli自动化测试课程
Marathahalli的硒检测课程
马拉塔纳利软件测试机构
Marathahalli的Selenium培训
Marathahalli最佳硒培训
Marathahalli的Selenium课程
你好,
回复 删除问题是:每次测试后,我应该退出驱动程序,然后在每次测试之前再次初始化它?
这需要一段时间。
如果我'm刚关闭后,每次测试后都会关闭,并在每个测试工作之前启动应用程序更快但如果我从不同的类测试中测试
如果每次测试后都不需要关闭司机。我们如何实现它?请您分享Testng.xml文件吗?
等待你的回复!
谢谢!!
嗨,我有一个查询,
回复 删除为什么你使用driver.java类来访问驱动程序对象?
为什么可以'我们在BaseSetup类中将驱动程序置于BaseTected成员,并使用该Android驱动程序?
请更改这样的所需功能
回复 删除私人致命的能力能力
私有静态androiddriver androiddriver = null;
还有InitDriver()
删除此致命的空间概念=新的致命行为();
并用Cap替换=新的致命行为();
尝试块的第3个变化
Androiddriver =新的Androiddriver(新网址(ServerURL),功能); - 更改帽子的功能。
它将起作用
伟大的帖子。太感谢了。
回复 删除钦奈的移动应用开发公司
iit jee教练在巴特娜| Iit Jee Countitute in Patna |在Patna的Neet教练| Patna医疗教练| Jee Mains,Jee Expless教练在Patna |欧罗巴课程
回复 删除Jee Mains,Jee Events教练在Patna
亚马逊的热门优惠]
技术提示
anushka sen.
tipsontechnology
回复 删除每次新技术提示
嘿我的观众,在这个网站中我们’LL帖子关于技术的许多提示。许多关于黑客,教育和许多娱乐利基的提示。一世’ll post somethin 技术提示
g特别适合你,每天都是
所以从这里看看它
销售印地语的所有产品
回复 删除Hindisales为您提供最富有成效的产品为您提供通知。如果您想为您购买任何产品。只需在Hindisales的那个产品上检查提供的产品,并从这里检查出来
亚马逊的热门优惠]
anushka sen: - 她是来自印度的女演员。她在他的小时代工作了很多角色。他的承运人的主要作用是 Balveer 作为mehar。人们叫他印度的紫色之星。他这个时代约17年了,她在他的代理承运人中获得了三大角色。现在她正在努力在Manikarnika(Jhansi Ki Rani)工作。
回复 删除anushka sen.
嗨,我们需要通过服务器IP和端口号
回复 删除我喜欢你的帖子有很多关于软件测试的信息,我想学习,谢谢你的伟大指导。非常有用的帖子,我认为从其他意见中看到它相当容易,这篇文章写得很好并有用。虽然是因为内容有用,但我从来没有失望的话,我又一对待了这篇博客。保持良好的工作..阅读更多关于 QA服务
回复 删除It'非常有用的博客帖子患有Inforamtive和洞察力的内容,我有很好的经验。我已经完成了 CRS信息解决方案主页 真的很好。了解更多详情 关于我们 CRS INFO解决方案。在这里,你可以看到 课程CRS信息解决方案 完整列表.Find是最好的 Hadoop培训 与大师。了解CRS信息解决方案 工作日培训 program.
回复 删除感谢您分享本文。它非常有价值的内容。我希望这些评论列表有助于我的网站
回复 删除工作日工作室在线培训
最佳工作日工作日在线培训
顶级工作日工作室在线培训
感谢您分享本文。它非常有价值的内容。我希望这些评论列表有助于我的网站
回复 删除顶级工作日在线培训
有机化学导师
回复 删除有机化学
在线导师