硒-单击按钮已注册,但未将页面重定向到目标链接

时间:2018-11-07 09:11:41

标签: java selenium testing automation

我正在使用Java中的Selenium测试Web UI。我来了一个测试用例,应该在加载新页面后立即单击链接到另一页面的按钮。

但是,有时单击该按钮时,不会触发页面重定向。我确定按钮会被正确点击,因为按钮动画会触发,硒会继续进行测试,但失败了,因为它找不到下一页上应该存在的任何元素。

一种可能的解决方法是在单击按钮之前使用Thread.sleep(),但我想避免这种解决方案。

我已经尝试过这种解决方法,可以检查是否发生了重定向,但这只会导致页面循环并且从不实际加载。

while(!driver.getCurrentUrl().toLowerCase().endsWith("login/checkout")) {
    driver.findElement(By.cssSelector("button[data-checkout-url='/cart/checkout']")).click();
}

例如,所讨论的按钮就是这个按钮。但是,此行为发生在多个按钮上。

<button class="btn btn-primary btn-block btn--continue-checkout js-continue-checkout-button"
   data-checkout-url="/cart/checkout">
   Checkout
</button>

该按钮由javascript处理,但是由于我仅测试UI,因此我对系统不了解。该按钮通常只会将您重定向到登录页面。

2 个答案:

答案 0 :(得分:1)

  

但是,有时单击该按钮时,没有页面重定向   触发。我确信该按钮会被正确点击,因为   按钮动画触发,Selenium继续进行测试   失败,因为它找不到应该存在的任何元素   下一页。

要找到一个健壮的解决方案,可能根本无法解决问题,并且无法调试页面以找出单击按钮时按钮正常运行的原因,以及在这种情况下失败的原因。理想情况下,您希望在不了解页面内部的情况下对其进行测试,但这有时是不可能的。

虽然只有调试才能真正告诉您出了什么问题,但我可以提供有根据的猜测:

加载可见部分后,页面似乎在后台执行其他初始化。例如,它可能在加载后运行JavaScript,并将事件处理程序附加到按钮。这意味着在加载页面后会有短暂的时间窗口,其中页面功能不完整。如果您在测试过程中碰到那个窗口,就会发生奇怪的事情。

要正确处理此问题,您将必须:

  • 在页面中找出尚未完全“就绪”的内容
  • 在页面中找到告诉您页面已准备就绪的内容,例如显示DIV
  • 将代码放入测试中(最好放入Page Object,您希望使用它)以等待页面准备就绪,通常使用WebDriverWait

不幸的是,如何执行此操作的详细信息取决于页面,因此您必须进行一些挖掘(请参见上面的:-))。顺便说一下,在测试复杂的Web应用程序时,这种类型的问题并不罕见:通常,在完成某项操作(例如页面加载或单击按钮)后,该应用程序会在后台执行某些操作,并且您必须等待“真正的完成”,然后再与页面进行互动。

  

一种可能的解决方法是在单击   按钮,但我想避免这种解决方案。

是的,这是一种解决方法,我已经实际使用过。如果上面概述的“适当”解决方案过于繁琐,那么这可能是一个务实的解决方案,但是您可能知道,它不是一个可靠的解决方案(您永远不知道要等待多长时间),并且如果使用频繁,将会降低测试速度,所以我认为它是不得已的选择。

答案 1 :(得分:-1)

您可以使用wait.until()命令来检查预期的元素是否已加载,并设置在实例化WebDriverWait()时查找该元素的最长时间

 WebDriverWait wait = new WebDriverWait(driver, 10);
 wait.until(ExpectedConditions.or(
 ExpectedConditions.visibilityOfElementLocated(By.id("id1")),
 ExpectedConditions.visibilityOfElementLocated(By.id("id2"))
 ));