You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Appium RemoteServer抛出UnreachableBrowserException问题求助

解决Appium多次运行测试抛出UnreachableBrowserException及元素定位问题

问题梳理

先帮你理清楚核心问题:

  • 测试环境:Windows 10、Appium 1.6.1、Eclipse Neon 3
  • 初始运行代码正常,但多次执行后抛出UnreachableBrowserException
  • 尝试改用AndroidDriver或AppiumDriver时,既解决不了异常,连testLogin()里的元素都定位不到

问题根源分析

结合你的代码和描述,问题主要出在这几个关键点:

  1. 端口用错:你代码里连接的是5038端口,这是adb的默认端口,但Appium服务的默认端口是4723,这直接导致多次运行后连接会话异常。
  2. Driver类型及初始化错误:RemoteWebDriver是通用远程驱动,移动端测试应该用Appium封装的AndroidDriver,之前的初始化方式不对导致元素定位失效。
  3. Capability参数错误:比如PlatformVersion拼写错误(应为小写的platformVersion),--session-override是命令行参数,代码里要改用sessionOverride这个capability。
  4. 会话清理不彻底:teardown里没有处理异常情况,导致部分会话未正确关闭,堆积后耗尽Appium连接资源。
  5. 元素定位符为空:你代码里的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();
        }
    }
}

额外优化建议

  1. 重启Appium服务:如果多次运行后仍偶尔出现连接异常,可在测试前通过命令行重启Appium(Windows下执行taskkill /F /IM node.exe结束进程,再重新启动Appium)。
  2. 检查设备状态:模拟器长时间运行易卡顿,建议在setup里先检查设备是否在线,或添加重启模拟器的逻辑。
  3. 升级Appium版本:Appium 1.6.1版本较旧,很多bug已在后续版本修复,建议升级到1.22.x这类稳定版本。
  4. 使用uiautomatorviewer获取元素:一定要用Android SDK自带的uiautomatorviewer工具获取正确的元素定位符,不要留空或随意填写。

内容的提问来源于stack exchange,提问作者Dhaval Mahajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:19:33