Selenium字符串比对失败 特殊破折号编码问题无法解决
问题根因
该问题是典型的字符编码解码不匹配导致:UI中的长破折号「—」为Unicode U+2014字符,UTF-8编码对应三个字节0xE2 0x80 0x94,当这三个字节被错误按照单字节编码ISO-8859-1解码时,就会呈现为—的乱码。
之前两种方案无效的原因:
replaceAll("â€", "-")仅替换了乱码的部分字符,未覆盖完整的乱码序列new String(subject.getBytes("UTF-8"), "UTF-8")属于同编码重复转换,没有解决原始解码错误的问题
控制台打印乱码是本地IDE控制台默认编码未设置为UTF-8导致,不影响代码内字符串的实际值处理。
可行解决方案(均无需正则)
方案1:标准库原生编码修正
直接将错误解码的字符串按原错误编码转回字节数组,再用UTF-8重新解码即可还原正确字符串:
String correctedText = new String(rawText.getBytes("ISO-8859-1"), "UTF-8");
方案2:基于Apache Commons Lang3统一标点格式
如果仅需保证内容比对一致,可统一将特殊长破折号替换为普通短横线,无需处理编码,调用StringUtils.replace(非正则实现)完成替换:
import org.apache.commons.lang3.StringUtils; // 统一实际值和预期值的标点格式 String actual = StringUtils.replace(rawText, "—", "-"); String expected = StringUtils.replace(expectedValue, "—", "-");
原有代码修改示例
if(loc.contains("Canada")) { String rawActual = somelocator.getText().trim(); // 采用方案1修正编码后断言 String correctedActual = new String(rawActual.getBytes("ISO-8859-1"), "UTF-8"); Assert.assertEquals(correctedActual, ExpectedValue); }
内容的提问来源于stack exchange,提问作者QualityMatters
相关产品推荐
相关产品推荐

