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

如何在真实Android设备上实现移动浏览器交互自动化?

可行的Android设备浏览器交互自动化方案

问题本质

Selenium的架构依赖桌面端浏览器驱动程序(如geckodriver、chromedriver)与浏览器进程通信,这种模式无法适配Android设备上的独立APP运行场景,端口占用问题就是架构不兼容的直接表现,因此需要换用适配Android生态的自动化方案。


方案1:Android官方UiAutomator2框架

直接操作设备上的原生浏览器(如Chrome),无需依赖Selenium驱动,通过系统级UI定位完成交互。

  • 核心步骤:
    1. 引入依赖(build.gradle):
      dependencies {
          implementation 'androidx.test.uiautomator:uiautomator:2.2.0'
      }
      
    2. 编写自动化代码(Java):
      import androidx.test.uiautomator.UiDevice;
      import androidx.test.uiautomator.UiObject;
      import androidx.test.uiautomator.UiObjectNotFoundException;
      import androidx.test.uiautomator.UiSelector;
      import androidx.test.platform.app.InstrumentationRegistry;
      import android.content.Context;
      import android.content.Intent;
      import android.net.Uri;
      import android.os.RemoteException;
      
      public class RouterAutomator {
          public void runLoginFlow(Context context) throws RemoteException, UiObjectNotFoundException {
              UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
              
              // 启动Chrome并打开路由器管理页
              Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://192.168.0.1/webpages/index.html#/login"));
              intent.setPackage("com.android.chrome");
              context.startActivity(intent);
              
              // 等待密码输入框加载(需根据实际页面元素调整定位规则)
              UiObject passwordInput = device.findObject(new UiSelector()
                      .className("android.widget.EditText")
                      .textContains("密码"));
              passwordInput.setText("<MY_LOCAL_PASSWORD>");
              
              // 定位并点击登录按钮
              UiObject loginBtn = device.findObject(new UiSelector()
                      .className("android.widget.Button")
                      .text("登录"));
              loginBtn.click();
          }
      }
      
  • 注意事项:需开启设备开发者选项,APP需申请INTERNET、ACCESS_NETWORK_STATE权限;定位WebView内元素时,可结合Chrome远程调试获取元素文本/ID信息。

方案2:Appium(基于UiAutomator2驱动)

跨平台自动化框架,API与Selenium高度兼容,复用原有定位逻辑的成本低。

  • 核心步骤:
    1. 在Android设备上部署Appium Server(或使用移动端Appium客户端)。
    2. 配置Desired Capabilities,指定Chrome浏览器:
      import io.appium.java_client.android.AndroidDriver;
      import org.openqa.selenium.remote.DesiredCapabilities;
      import java.net.URL;
      
      public class AppiumRouterAutomation {
          public void startAutomation() throws Exception {
              DesiredCapabilities caps = new DesiredCapabilities();
              caps.setCapability("platformName", "Android");
              caps.setCapability("deviceName", "Android Device");
              caps.setCapability("browserName", "Chrome");
              // 需指定与设备Chrome版本匹配的chromedriver路径
              caps.setCapability("chromedriverExecutable", "/sdcard/chromedriver");
      
              AndroidDriver driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), caps);
              driver.get("http://192.168.0.1/webpages/index.html#/login");
              
              // 复用原有Selenium定位逻辑
              driver.findElementByXPath("//input[@type='password']").sendKeys("<MY_LOCAL_PASSWORD>");
              driver.findElementByXPath("//button[@class='login-btn']").click();
              
              driver.quit();
          }
      }
      
  • 注意事项:必须保证chromedriver版本与设备Chrome版本完全匹配,否则会出现启动失败问题。

方案3:WebView嵌入+JavaScript注入

自行开发APP,内置WebView加载路由器页面,通过JS注入直接操作页面元素,稳定性最高。

  • 核心步骤:
    1. 布局中添加WebView:
      <WebView
          android:id="@+id/router_webview"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>
      
    2. 代码配置WebView并注入JS:
      import android.os.Bundle;
      import android.webkit.WebSettings;
      import android.webkit.WebView;
      import android.webkit.WebViewClient;
      import androidx.appcompat.app.AppCompatActivity;
      
      public class RouterManagementActivity extends AppCompatActivity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              WebView webView = findViewById(R.id.router_webview);
              WebSettings settings = webView.getSettings();
              settings.setJavaScriptEnabled(true);
              // 忽略HTTPS证书校验(若路由器页面使用HTTPS)
              settings.setDomStorageEnabled(true);
      
              webView.setWebViewClient(new WebViewClient() {
                  @Override
                  public void onPageFinished(WebView view, String url) {
                      super.onPageFinished(view, url);
                      // 注入JS完成登录操作
                      view.evaluateJavascript(
                          "document.querySelector('input[type=\"password\"]').value = '<MY_LOCAL_PASSWORD>'; " +
                          "document.querySelector('button.login-btn').click();",
                          result -> {}
                      );
                  }
              });
      
              webView.loadUrl("http://192.168.0.1/webpages/index.html#/login");
          }
      }
      
  • 优势:无需依赖外部驱动,APP体积小,操作直接可控;可通过JS实现复杂的页面交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:05:00