image.png
    正好学员群里有人卡在了WebDriver自动化上,看截图应该毫无难度,但是却反馈真心无解,抱着相信学员(红包)的心态挑战困难,尝试了一下。

    首先遇到的问题是启动首页就出现了错误提示登录input定位失败,而且出错非常的快,我前台浏览器都还没切换(注意这里是一个要点)。
    遇到这个问题当然是直接写个等待咯,为了调试方便,我直接写了个线程等待。于是乎系统首页加载,然后正确识别定位,成功登录。那么继续后续的业务吧,出错的情况还是一样,对象不存在,而且加了等待也失败,这时候我就好奇了,然后查看了一下f12页面的元素,没有iframe看起来一切都如此的规范符合HTML,定位也是正确唯一的,问题在哪里呢?

    那种挑战问题的心态一起来,就没有什么可以阻止我的斗志了。先看了下Network的请求,期望看一下是不是多个html页面组成的,然而让我吃惊的是密密麻麻的js完全没看到页面,但是在HTML标签中却是正常的。
    image.png
    对应的Html
    image.png
    怎么可能,为了找到事情的源头,于是我从webdriver入手看看到底代码遇到了什么问题,通过getAttribute来获取一下webdriver拿到的实际内容。

    1. System.out.println(wd.findElement(By.xpath("/html")).getAttribute("innerHTML"));

    查看对应的日志发现了一段和HTML很像的内容,通过查找元素也找到了要操作的对象,于是乎直接补上后续定位,操作成功。
    本以为问题就这样解决了,等待享受成功犒劳的时候,新的问题又出现了,后续提交按钮点不上。于是作为老师送佛送到西的态度,一边鄙视的心态一边又打开了代码,试了一下,啊确实不行,再核对了一下服务器返回的内容和页面内容,提交按钮的这块div就是不存在的!
    什么webdriver拿到的页面和我看到的页面不一样?
    这里出现了颠覆我认知的情况,这不可能!于是我手动刷新了一下页面发现了其中的奥妙,提交按钮这一块是要等待页面最后的时候才出现的,于是乎xhr的异步加载元素体系进入了我的脑海,以前写webdirver遇到过等待对象完整加载的情况,难道是这个原因?
    再把等待页面加载时间放长一点,通过innerHTML比较返回,好家伙果然这次所有对象都返回了,怪说不得点不到提交按钮。

    问题虽然解决了但是系统为什么这样做让我很好奇,于是我看了下network的请求,找到了js的说明

    1. /*!
    2. * @ekp-infra/requirejs v1.2.32
    3. * Copyright© 2020 Landray

    原来是requirejs框架,再看了一下入门文档,果然是js加载模型,那么webdriver找不到对象就顺理成章了。

    webdriver默认只会等待浏览器的第一次加载完成状态从而认为页面已经正常加载(具体事件是Onload什么我也记不清楚了),这个时候就会直接执行下一条findelement语句,而这时候js还没有完全把资源加载进来并且渲染成为Html,这样就会导致查找对象失败。
    解决这个问题的方法是通过po封装一个等待对象出现再执行的方法,检查的关键是requirejs的完整加载最后一个标签是什么,这里由于时间和项目是学员公司项目我就不方便细究了,找到这个标志对所有的findelement做这样的检查规则即可一次性完美解决问题!