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

BrowserStack移动端Web自动化:配置URL与场景读取异常问题

问题排查与修复方案

1. 核心BUG:重复创建RemoteWebDriver实例

你的移动端Driver代码存在严重逻辑错误:先初始化一个driver并完成页面加载、Cookie操作,但最后返回的是全新的未初始化页面的RemoteWebDriver实例,直接导致之前的会话被丢弃,Cucumber步骤无法关联到正确的浏览器会话。

错误代码片段:

WebDriver driver = new RemoteWebDriver(new URL(Objects.requireNonNull(setURL())), caps);
// 执行driver.get和Cookie操作...
return new RemoteWebDriver(new URL(Objects.requireNonNull(setURL())), caps); // 返回全新实例,之前的操作全部无效

修复:

直接返回已经初始化并完成页面加载的driver实例,删除重复创建的代码:

public static RemoteWebDriver getBrowserStackDriver(Scenario scenario) throws MalformedURLException {
    DesiredCapabilities caps = new DesiredCapabilities();
    Map<String,String> bsCapabilities = new HashMap<>();
    caps.setCapability("browserName", "safari");
    caps.setCapability("device", "iPhone 14");
    caps.setCapability("realMobile", "true");
    caps.setCapability("os_version", "16");
    bsCapabilities.put("browserstack.idleTimeout", "90");
    bsCapabilities.put("browserstack.selenium_version", BasePage.readConfig("bs_selenium_version"));
    bsCapabilities.put("browserstack.use_w3c", BasePage.readConfig("browserstack_use_w3c"));
    caps.setCapability("name", scenario.getName());
    bsCapabilities.forEach(caps::setCapability);

    RemoteWebDriver driver = new RemoteWebDriver(new URL(Objects.requireNonNull(setURL())), caps);
    WebDriverWait wait = new WebDriverWait(driver, 10);
    
    try {
        // 从配置读取URL,替换硬编码
        driver.get(BasePage.readConfig("app_url"));
        WebElement cookiepopUp=wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@id='onetrust-accept-btn-handler']")));
        cookiepopUp.click();
    } catch (Exception e) {
        logger.fatal("Browserstack driver is not initialized");
        driver.quit(); // 出错时关闭会话
        Assert.fail("ERROR: Browserstack driver is not initialized: " + e);
    }
    return driver; // 返回已初始化的实例
}

2. 配置读取方法不一致

代码中混用BasePage.setValue()和BasePage.readConfig()两个方法读取配置:

  • setURL()中用BasePage.setValue("browserstack_username")获取配置
  • 其他模块用BasePage.readConfig("chrome_emulation_device")读取配置

从方法名判断,setValue()更偏向设置配置而非读取,这会导致无法正确获取配置项的值,进而生成错误的BrowserStack hub URL或应用URL。

修复:

统一使用BasePage.readConfig()读取所有配置项,修改setURL()方法:

private static String setURL() {
    String url = "";
    if (endpoint.startsWith("saucelabs"))
        url = "http://" + BasePage.readConfig("sauce_username") + ":" + BasePage.readConfig("sauce_accesskey")
                + "@ondemand.eu-central-1.saucelabs.com/wd/hub";
    else if (endpoint.startsWith("browserstack"))
        url = "https://" + BasePage.readConfig("browserstack_username") + ":" + BasePage.readConfig("browserstack_accesskey")
                + "@hub-cloud.browserstack.com/wd/hub";
    return url;
}

3. 真实设备Capabilities兼容性优化

针对BrowserStack真实iPhone设备,调整Capabilities以提升兼容性:

  • 改用MutableCapabilities替代DesiredCapabilities(与桌面端保持一致)
  • 添加browserstack.appium_version配置(真实设备依赖Appium驱动)
  • 确认W3C模式设置为true

示例调整后的Capabilities代码:

MutableCapabilities caps = new MutableCapabilities();
Map<String,String> bsCapabilities = new HashMap<>();
caps.setCapability("browserName", "safari");
caps.setCapability("device", "iPhone 14");
caps.setCapability("realMobile", "true");
caps.setCapability("os_version", "16");
bsCapabilities.put("browserstack.idleTimeout", "90");
bsCapabilities.put("browserstack.selenium_version", BasePage.readConfig("bs_selenium_version"));
bsCapabilities.put("browserstack.use_w3c", "true");
bsCapabilities.put("browserstack.appium_version", "2.0.0"); // 添加Appium版本配置
caps.setCapability("name", scenario.getName());
bsCapabilities.forEach(caps::setCapability);

4. Cucumber场景关联验证

确保:

  • scenario参数正确传递到Driver初始化方法,caps.setCapability("name", scenario.getName())能正确设置会话名称,在BrowserStack控制台可查看对应场景名
  • Feature文件中的步骤(如Given The user navigates to homepage)在修复Driver实例问题后,能关联到已加载页面的driver,无需重复调用driver.get()

验证步骤

  1. 修复重复创建Driver的问题,返回已初始化的实例
  2. 统一配置读取方法为readConfig()
  3. 调整真实设备的Capabilities
  4. 在configProperties中添加app_url=https://www.flexa.nl配置项
  5. 重新运行@Mobile_Smoke标签的Cucumber场景,查看BrowserStack控制台的会话是否正确加载页面,且场景步骤正常执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:32:35