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

如何用Java结合Selenium与UTAM实现基于JSON的自动化测试?

问题排查与解决方案

一、核心错误分析

  1. JSON结构与代码解析不匹配

    • JSON中元素定义在shadow.elements下,但Java代码直接从根节点读取elements,导致elementsArray为null,触发空指针异常。
    • 读取selector时,直接将嵌套的JSONObject强转为String,会抛出类型转换错误,因为selector是JSON对象而非字符串。
  2. 选择器过于宽泛无效

    • JSON中所有选择器都用div,谷歌首页存在大量div元素,无法定位到目标“图片”按钮,必然导致元素找不到或点击错误元素。
  3. 缺少元素等待机制

    • 页面未完全加载就执行元素定位,容易出现NoSuchElementException。

二、修正后的JSON配置

谷歌首页“图片”按钮无需操作Shadow DOM,使用精准选择器即可。调整后的JSON如下:

{
  "root": true,
  "selector": {
    "css": "body"
  },
  "elements": [
    {
      "name": "imagesTab",
      "type": "clickable",
      "selector": {
        "css": "a[href='/imghp?hl=en&tab=wi']"
      }
    }
  ]
}
  • 选择器说明:a[href='/imghp?hl=en&tab=wi']是谷歌首页“图片”按钮的精准CSS选择器,可通过浏览器开发者工具验证:右键点击“图片”按钮→检查→复制CSS选择器。

三、修正后的Java代码

修复JSON解析逻辑,添加显式等待确保元素加载完成:

package com.utam;

import java.io.FileReader;
import java.io.IOException;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;

public class Sofft {

    public static void main(String[] args) throws IOException, ParseException {
        // 初始化ChromeDriver(Selenium 4.6+可省略系统属性设置,自动管理驱动)
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        // 显式等待,最长10秒
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

        // 打开谷歌首页
        driver.get("https://www.google.com/");

        // 解析JSON配置文件
        JSONParser parser = new JSONParser();
        JSONObject jsonObject = (JSONObject) parser.parse(new FileReader("C:\\UTAM\\utam-sample\\src\\test\\utam\\test.json"));

        // 读取elements数组
        JSONArray elementsArray = (JSONArray) jsonObject.get("elements");
        JSONObject imageTabElement = (JSONObject) elementsArray.get(0);
        
        // 解析元素的CSS选择器
        JSONObject selectorObj = (JSONObject) imageTabElement.get("selector");
        String cssSelector = (String) selectorObj.get("css");

        // 等待元素可点击并点击
        WebElement imagesTab = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssSelector)));
        imagesTab.click();

        // 后续操作,比如关闭浏览器
        // driver.quit();
    }
}
  • 关键修正点:
    1. 正确解析嵌套的selector对象,提取CSS选择器字符串。
    2. 从根节点的elements数组读取元素配置(匹配修正后的JSON结构)。
    3. 添加WebDriverWait显式等待,避免页面未加载完成导致的元素找不到问题。
    4. 移除冗余的rootSelector读取(当前逻辑未用到,后续可按需扩展)。

四、验证选择器的方法

  1. 打开谷歌首页,右键点击“图片”按钮,选择“检查”打开开发者工具。
  2. 在Elements面板中选中对应的<a>标签,右键→Copy→Copy selector,得到精准CSS选择器。
  3. 在开发者工具Console面板输入document.querySelector("你的选择器"),回车后返回目标元素则说明选择器有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:22:17