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

Appium中element.text返回JSON翻译标签而非实际文本的求助

解决ngx-translate渲染文本时Selenium获取到翻译键而非实际文本的问题

我明白你遇到的问题了——ngx-translate是在客户端浏览器里动态完成翻译渲染的,Selenium如果在Angular完成翻译替换之前就调用element.text,拿到的自然是JSON里的原始键值(比如HELLO、MENU.PORTUGUESE),而不是屏幕上显示的最终翻译文本。下面给你几个实用的解决方案:

方案1:用显式等待确保翻译完成(推荐)

显式等待是Selenium的最佳实践,它会等待到指定条件满足后再执行操作,比固定sleep更可靠。你可以修改HelperSelenium类,加入等待逻辑,直到元素文本不再包含翻译键:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class HelperSelenium:
    def getTextFromElement(driver, element, timeout=10):
        if element is None:
            raise Exception("getTextFromElement element is None")
        try:
            # 等待元素文本不再是原始翻译键(根据你的场景调整判断条件)
            WebDriverWait(driver, timeout).until(
                lambda d: not ("HELLO" in element.text and "MENU.PORTUGUESE" in element.text)
            )
            return element.text
        except Exception as e:
            if "timeout" in str(e).lower():
                return "TIMEOUT WAITING FOR TRANSLATION"
            return "ELEMENT NOT FOUND BY WEBDRIVER"

调用时记得传入driver实例:

textA = self.HelperSelenium.getTextFromElement(self.driver, self.Starter.WELCOME_VIEW())

方案2:直接读取浏览器渲染后的文本属性

有时候element.text可能因为Angular变更检测延迟返回原始值,你可以尝试直接读取innerText或textContent属性,这两个属性直接获取浏览器渲染完成后的文本:

class HelperSelenium:
    def getTextFromElement(element):
        if element is None:
            raise Exception("getTextFromElement element is None")
        try:
            # 优先获取innerText,这是浏览器实际显示的文本
            translated_text = element.get_attribute('innerText')
            # 如果还是拿到了翻译键,短暂等待后重试(最好用显式等待替代sleep)
            if "HELLO" in translated_text or "MENU.PORTUGUESE" in translated_text:
                import time
                time.sleep(1.5)
                translated_text = element.get_attribute('innerText')
            return translated_text if translated_text else "ELEMENT NOT FOUND BY WEBDRIVER"
        except Exception as e:
            return f"ERROR: {str(e)}"

方案3:等待Angular稳定(针对Angular应用)

如果你的应用是Angular项目,可以通过执行JavaScript等待Angular的变更检测完成,确保翻译已经渲染完毕:

def wait_for_angular_stable(driver):
    driver.execute_script("""
        return new Promise((resolve) => {
            if (window.getAngularTestability) {
                window.getAngularTestability(document.body).whenStable(resolve);
            } else {
                // 非Angular环境直接resolve
                resolve();
            }
        });
    """)

# 在获取文本前调用这个方法
wait_for_angular_stable(self.driver)
textA = self.HelperSelenium.getTextFromElement(self.Starter.WELCOME_VIEW())

总结

最稳妥的方式是方案1的显式等待,它能适配不同设备的加载速度,避免固定等待时间的不确定性。如果你的测试环境是Angular项目,方案3能从根源上确保页面渲染完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:50:48