一尘不染

通过JS事件加载新页面时,如何使Selenium WebDriver等待页面加载

selenium

我正在自动化一个包含许多链接的站点,这些链接通过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知道需要新的页面并等待它可用?


阅读 634

收藏
2020-06-26

共1个答案

一尘不染

您需要明确的等待;

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

您可以将其直接添加到测试中,也可以将其干燥,特别是在有常见的等待期望(例如旋转图标消失)的情况下。

您可以将click方法扩展为单击后始终等待,或者如果跟随页面对象,则在基页类中添加一个wait_until_loaded方法。还有许多其他有效方法,但取决于如何实现AUT

2020-06-26