appium 处理动态控件
环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html
知乎Android客户端登陆:http://www.cnblogs.com/tobecrazy/p/4579631.html
appium实现截图和清空EditText:http://www.cnblogs.com/tobecrazy/p/4592405.html
最近有人问我appium能否处理动态生成的控件,由于以没做过,不敢肯定,所以就自己谢了一个测试Demo
由于自己不小心appiumDemo打错写为apppiumDemo
第一步: 创建Android project 在onCreate方法里添加一个button控件
1 Button bt = new Button(this); 2 bt.setText("Test"); 3 bt.setPadding(300, 0, 0, 0); 4 5 RelativeLayout relativeLayout = (RelativeLayout) getLayoutInflater() 6 .inflate(R.layout.activity_main, null); 7 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( 8 ViewGroup.LayoutParams.MATCH_PARENT, 9 ViewGroup.LayoutParams.WRAP_CONTENT); 10 layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, -1); 11 relativeLayout.addView(bt, layoutParams); 12 setContentView(relativeLayout);
下载地址:http://pan.baidu.com/s/1o6mokLO
第二步:使用uiautomatorviewer获取控件
其实动态生成的控件和使用xml的一样,只不过没有添加resource-id
第三部: 获取控件
a.使用 findByClassName
driver.findElementByClassName("android.widget.Button");
b.使用xpath
driver.findElementByXPath("//android.widget.Button");
第三部:使用appium验证
1 package com.dbyl.core; 2 3 import org.openqa.selenium.remote.CapabilityType; 4 import org.openqa.selenium.remote.DesiredCapabilities; 5 import org.testng.Assert; 6 import org.testng.annotations.AfterMethod; 7 import org.testng.annotations.BeforeMethod; 8 import org.testng.annotations.Test; 9 10 import io.appium.java_client.android.AndroidDriver; 11 12 import java.io.File; 13 import java.net.URL; 14 import java.util.concurrent.TimeUnit; 15 16 public class AppDemo { 17 private AndroidDriver driver; 18 19 @BeforeMethod(alwaysRun = true) 20 public void setUp() throws Exception { 21 // set up appium 22 DesiredCapabilities capabilities = new DesiredCapabilities(); 23 capabilities.setCapability(CapabilityType.BROWSER_NAME, ""); 24 capabilities.setCapability("platformName", "Android"); 25 capabilities.setCapability("deviceName", "Android Emulator"); 26 capabilities.setCapability("platformVersion", "4.4"); 27 // if no need install don't add this 28 29 File classpathRoot = new File(System.getProperty("user.dir")); 30 File appDir = new File(classpathRoot, "apps"); 31 File app = new File(appDir, "apppiumDemo.apk"); 32 capabilities.setCapability("app", app.getAbsolutePath()); 33 34 capabilities.setCapability("appPackage", "com.example.apppiumdemo"); 35 // support Chinese 36 capabilities.setCapability("unicodeKeyboard", "True"); 37 capabilities.setCapability("resetKeyboard", "True"); 38 // no need sign 39 capabilities.setCapability("noSign", "True"); 40 capabilities.setCapability("appActivity", ".MainActivity"); 41 driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), 42 capabilities); 43 } 44 45 @AfterMethod(alwaysRun = true) 46 public void tearDown() throws Exception { 47 driver.quit(); 48 } 49 50 @Test(groups = { "Test" }) 51 public void Test() { 52 driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 53 Assert.assertEquals(driver.findElementByClassName("android.widget.Button").getText(),"Test"); 54 System.out.println(driver.findElementByXPath("//android.widget.Button").getText()); 55 56 57 } 58 }
运行结果:
PASSED:Test
===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
总结: 无论何种方式生成的控件,都可以识别,如果没有resource-id可以使用其他方式,比如ByClass ByXpath等

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义