能否在同一Java程序中用Selenium与Appium实现安卓APP与网页通话自动化?
可以在同一Java程序中同时使用Selenium WebDriver和Appium AndroidDriver
当然可以,这两个Driver分属不同的自动化工具栈,只要配置正确就能在同一个Java项目中独立运行,完美实现你需要的安卓APP发起通话、网页端接听的跨端自动化流程。
环境准备
先确保本地环境满足以下要求:
- JDK 1.8及以上版本
- Appium Server(命令行版或Desktop版均可)
- 配置好
ANDROID_HOME环境变量的Android SDK - 与本地Chrome版本匹配的ChromeDriver(可放在系统PATH或项目根目录)
- 项目引入依赖(以Maven为例):
<dependencies> <!-- Selenium Java客户端 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.15.0</version> </dependency> <!-- Appium Java客户端 --> <dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>8.5.1</version> </dependency> </dependencies>
初始化两个Driver的代码示例
在同一个Java类中分别初始化AndroidDriver(控制安卓APP)和ChromeDriver(控制网页),各自配置对应的Desired Capabilities即可:
import io.appium.java_client.android.AndroidDriver; import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; public class CrossPlatformCallAutomation { private static AndroidDriver androidDriver; private static ChromeDriver webDriver; // 初始化AndroidDriver private static void setupAndroidDriver() throws MalformedURLException { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("platformName", "Android"); caps.setCapability("deviceName", "你的设备名称(比如emulator-5554或真机型号)"); caps.setCapability("appPackage", "你的安卓APP包名"); caps.setCapability("appActivity", "APP的启动Activity路径"); caps.setCapability("automationName", "UiAutomator2"); caps.setCapability("noReset", true); // 避免每次启动重置APP状态 caps.setCapability("autoGrantPermissions", true); // 自动授予APP所需权限 // 连接本地Appium服务,默认端口4723 androidDriver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), caps); } // 初始化ChromeDriver private static void setupChromeDriver() { // 如果ChromeDriver不在系统PATH中,需要手动指定路径 // System.setProperty("webdriver.chrome.driver", "./chromedriver.exe"); webDriver = new ChromeDriver(); webDriver.manage().window().maximize(); } public static void main(String[] args) throws MalformedURLException, InterruptedException { // 1. 初始化两个Driver setupAndroidDriver(); setupChromeDriver(); // 2. 安卓APP端发起通话 // 定位并点击发起通话的按钮(替换成你APP的实际元素定位符) androidDriver.findElement(By.id("com.your.app:id/btn_initiate_call")).click(); // 等待通话请求发送到网页端(根据实际场景调整等待逻辑) Thread.sleep(3000); // 3. 网页端登录并接听通话 webDriver.get("https://你的网页通话系统地址"); // 登录操作(替换成网页的实际元素定位符) webDriver.findElement(By.id("username_input")).sendKeys("your_login"); webDriver.findElement(By.id("password_input")).sendKeys("your_password"); webDriver.findElement(By.id("login_button")).click(); // 使用显式等待替代Thread.sleep,更稳定 WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(10)); wait.until(ExpectedConditions.elementToBeClickable(By.id("accept_call_btn"))).click(); // 4. 测试完成后关闭资源 androidDriver.quit(); webDriver.quit(); } }
关键注意事项
- 同步逻辑:尽量用
WebDriverWait显式等待替代固定时长的Thread.sleep(),避免因加载速度差异导致的元素定位失败 - 权限处理:安卓端通过
autoGrantPermissions自动授权,避免手动弹窗干扰自动化流程 - 设备验证:运行前用
adb devices确认设备已正常连接,模拟器或真机都可以 - 版本兼容:确保ChromeDriver版本与本地Chrome浏览器版本一致,Appium Java Client版本与Appium Server版本兼容
内容的提问来源于stack exchange,提问作者Gireesh K K
相关产品推荐
相关产品推荐

