Java+Selenium自动化测试登录后找不到id为ingelogdeGebruiker的元素
问题排查与解决方案
- 首先确认页面实际加载状态
你在执行ldriver.navigate().to(website.getUrl() + "/producer/vaststelling/files")之后,先打印当前页面URL、输出当前页面源码,或者直接调用截图方法保存当前页面,确认你跳转后打开的确实是登录后的目标页面,有没有出现未授权跳转回登录页、403页的情况。从你给出的元素属性带_ngcontent可以看出网站是Angular开发的单页应用,硬跳转路径可能会触发前端路由的登录态校验逻辑,你mock的登录态如果没同步到浏览器存储里,就会被拦截跳走。 - 检查是否存在iframe嵌套
很多系统会把顶部导航栏放到独立的iframe中,WebDriver默认只会查找根文档的元素,嵌套在iframe里的元素是找不到的。你可以手动打开浏览器控制台,先执行document.getElementById("ingelogdeGebruiker"),如果返回null,再切换到页面里的各个iframe上下文再次执行查找,确认元素所属的iframe,测试代码里在查找元素前添加切换iframe的逻辑:
操作完iframe内的元素后记得调用// 先定位到对应iframe,也可以用id、name等参数定位 WebElement navIframe = ldriver.findElement(By.cssSelector("iframe[导航栏iframe的特征]")); ldriver.switchTo().frame(navIframe);ldriver.switchTo().defaultContent()切回根文档。 - 调整元素等待策略
你当前用的visibilityOfElementLocated要求元素同时满足DOM存在且可见两个条件,如果你只需要校验登录成功,可先替换为presenceOfElementLocated确认元素是否已经插入DOM,再判断可见性。另外针对Angular单页应用,普通的显式等待不会等待前端异步请求、模板渲染完成,你可以增加等待Angular稳定的逻辑,或者延长等待的同时调整等待的轮询间隔。
调整后的等待代码参考:// 等待15秒,每500毫秒轮询一次 WebDriverWait wait = new WebDriverWait(ldriver, Duration.ofSeconds(15)); // 先确认元素存在于DOM wait.until(ExpectedConditions.presenceOfElementLocated(By.id("ingelogdeGebruiker"))); // 再确认元素可见 WebElement controleElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ingelogdeGebruiker"))); - 补充登录态同步等待逻辑
你点击inloggenEherkenning按钮之后直接执行跳转,可能mock的登录凭证还没写入浏览器的Cookie、LocalStorage就已经跳转,导致跳转后的请求不带登录态返回未登录页面。你可以在点击登录按钮之后、跳转之前,增加等待登录凭证写入的逻辑,比如等指定的登录Cookie存在之后再执行跳转。
内容的提问来源于stack exchange,提问作者Senpai
相关产品推荐
相关产品推荐

