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
相关产品推荐
相关产品推荐

