如何用Java结合Selenium与UTAM实现基于JSON的自动化测试?
问题排查与解决方案
一、核心错误分析
JSON结构与代码解析不匹配
- JSON中元素定义在
shadow.elements下,但Java代码直接从根节点读取elements,导致elementsArray为null,触发空指针异常。 - 读取
selector时,直接将嵌套的JSONObject强转为String,会抛出类型转换错误,因为selector是JSON对象而非字符串。
- JSON中元素定义在
选择器过于宽泛无效
- JSON中所有选择器都用
div,谷歌首页存在大量div元素,无法定位到目标“图片”按钮,必然导致元素找不到或点击错误元素。
- JSON中所有选择器都用
缺少元素等待机制
- 页面未完全加载就执行元素定位,容易出现
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(); } }
- 关键修正点:
- 正确解析嵌套的
selector对象,提取CSS选择器字符串。 - 从根节点的
elements数组读取元素配置(匹配修正后的JSON结构)。 - 添加
WebDriverWait显式等待,避免页面未加载完成导致的元素找不到问题。 - 移除冗余的
rootSelector读取(当前逻辑未用到,后续可按需扩展)。
- 正确解析嵌套的
四、验证选择器的方法
- 打开谷歌首页,右键点击“图片”按钮,选择“检查”打开开发者工具。
- 在Elements面板中选中对应的
<a>标签,右键→Copy→Copy selector,得到精准CSS选择器。 - 在开发者工具Console面板输入
document.querySelector("你的选择器"),回车后返回目标元素则说明选择器有效。
内容的提问来源于stack exchange,提问作者nandini Basavaraj
相关产品推荐
相关产品推荐

