Appium RemoteServer抛出UnreachableBrowserException问题求助
解决Appium多次运行测试抛出UnreachableBrowserException及元素定位问题
问题梳理
先帮你理清楚核心问题:
- 测试环境:Windows 10、Appium 1.6.1、Eclipse Neon 3
- 初始运行代码正常,但多次执行后抛出
UnreachableBrowserException - 尝试改用
AndroidDriver或AppiumDriver时,既解决不了异常,连testLogin()里的元素都定位不到
问题根源分析
结合你的代码和描述,问题主要出在这几个关键点:
- 端口用错:你代码里连接的是
5038端口,这是adb的默认端口,但Appium服务的默认端口是4723,这直接导致多次运行后连接会话异常。 - Driver类型及初始化错误:
RemoteWebDriver是通用远程驱动,移动端测试应该用Appium封装的AndroidDriver,之前的初始化方式不对导致元素定位失效。 - Capability参数错误:比如
PlatformVersion拼写错误(应为小写的platformVersion),--session-override是命令行参数,代码里要改用sessionOverride这个capability。 - 会话清理不彻底:
teardown里没有处理异常情况,导致部分会话未正确关闭,堆积后耗尽Appium连接资源。 - 元素定位符为空:你代码里的
By.id("")都是空值,这肯定定位不到元素!
修复后的完整代码
我针对上述问题做了针对性修改,以下是修复后的代码:
package basic_scenario; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.android.AndroidDriver; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class Login_TG { // 改用Appium专为Android提供的AndroidDriver AndroidDriver<WebElement> driver; @BeforeTest public void setup() throws MalformedURLException { String apkpath = "C:\\Users\\rgi-40\\android-sdks\\platform-tools\\AG.apk"; File app = new File(apkpath); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("browserName", ""); capabilities.setCapability("deviceName", "emulator-5554"); // 修正platformVersion的大小写拼写 capabilities.setCapability("platformVersion", "6.0"); capabilities.setCapability("app", app.getAbsolutePath()); capabilities.setCapability("platformName", "Android"); capabilities.setCapability("noReset", true); capabilities.setCapability("appActivity", "com.AG.BaseClasses.Navigation.Activity.SplashScreenActivity"); capabilities.setCapability("appPackage", "com.AG"); capabilities.setCapability("autoGrantPermissions", true); // newCommandTimeout用整数类型更规范 capabilities.setCapability("newCommandTimeout", 60); capabilities.setCapability("automationName", "Appium"); // 替换命令行参数为代码对应的capability capabilities.setCapability("sessionOverride", true); try { // 连接Appium默认的4723端口,而非adb的5038 driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); } catch (Exception e) { System.err.println("Driver初始化失败,错误信息:" + e.getMessage()); e.printStackTrace(); } } @Test public void testLogin() throws Exception { // 替换为你APP中实际的元素定位符,可通过uiautomatorviewer获取 WebElement login_element = driver.findElement(By.id("com.AG:id/login_button")); login_element.click(); // 用精准ID定位用户名输入框,比className更可靠 WebElement uname_element = driver.findElement(By.id("com.AG:id/username_input")); uname_element.sendKeys("your_test_username"); WebElement pwd_element = driver.findElement(By.id("com.AG:id/password_input")); pwd_element.sendKeys("your_test_password"); WebElement submit_element = driver.findElement(By.id("com.AG:id/submit_button")); submit_element.click(); } @AfterTest public void teardown() { // 确保无论是否出现异常,都能彻底关闭会话 try { if (driver != null) { // 用quit()而非close(),quit会彻底销毁会话、释放Appium资源 driver.quit(); } } catch (Exception e) { System.err.println("关闭Driver失败,错误信息:" + e.getMessage()); e.printStackTrace(); } } }
额外优化建议
- 重启Appium服务:如果多次运行后仍偶尔出现连接异常,可在测试前通过命令行重启Appium(Windows下执行
taskkill /F /IM node.exe结束进程,再重新启动Appium)。 - 检查设备状态:模拟器长时间运行易卡顿,建议在
setup里先检查设备是否在线,或添加重启模拟器的逻辑。 - 升级Appium版本:Appium 1.6.1版本较旧,很多bug已在后续版本修复,建议升级到1.22.x这类稳定版本。
- 使用uiautomatorviewer获取元素:一定要用Android SDK自带的uiautomatorviewer工具获取正确的元素定位符,不要留空或随意填写。
内容的提问来源于stack exchange,提问作者Dhaval Mahajan
相关产品推荐
相关产品推荐

