我正在自动化一个包含许多链接的站点,这些链接通过JS事件加载新页面。基本上,有一些元素是可单击的,单击其中一个会导致运行一些JavaScript,这会导致提交表单并将其路由到新页面。
现在,如果这些只是标准的HTML链接,那将没有问题,因为Selenium足够聪明,可以告诉我们即将出现一个新页面并等待处理。但是,尽管如此,Selenium并不能说这种情况下的点击导致了新页面的加载,因此它不会等待并且只会继续前进。因此,它不等待新页面,而是尝试查找不存在的元素,并且我的测试全部失败。笨蛋
作为一个临时解决方案,我只是将程序暂停三秒钟,如下所示:
oldPageDriver.clickThatButton(); try { Thread.sleep(3000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } newPageDriver = new NewPageDriver(driver); newPageDriver.doStuffOnNewPage();
这是可行的。我不喜欢它,因为它是“ hacky”的,只是中断程序而不是做一些更聪明的事情。因为延迟是在三秒上硬编码的,所以如果链接正常工作,我会失败,但是速度很慢。我考虑过类似隐式等待之类的事情,但它完成了同样的事情,经过大量的查找,我在Java的任何地方都没有找到一个可靠,可行的答案。
那么,有人可以提出解决方案吗?具体来说,如何使Selenium知道需要新的页面并等待它可用?
您需要明确的等待;
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
您可以将其直接添加到测试中,也可以将其干燥,特别是在有常见的等待期望(例如旋转图标消失)的情况下。
您可以将click方法扩展为单击后始终等待,或者如果跟随页面对象,则在基页类中添加一个wait_until_loaded方法。还有许多其他有效方法,但取决于如何实现AUT