我正在使用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,因此我对系统不了解。该按钮通常只会将您重定向到登录页面。
答案 0 :(得分:1)
但是,有时单击该按钮时,没有页面重定向 触发。我确信该按钮会被正确点击,因为 按钮动画触发,Selenium继续进行测试 失败,因为它找不到应该存在的任何元素 下一页。
要找到一个健壮的解决方案,可能根本无法解决问题,并且无法调试页面以找出单击按钮时按钮正常运行的原因,以及在这种情况下失败的原因。理想情况下,您希望在不了解页面内部的情况下对其进行测试,但这有时是不可能的。
虽然只有调试才能真正告诉您出了什么问题,但我可以提供有根据的猜测:
加载可见部分后,页面似乎在后台执行其他初始化。例如,它可能在加载后运行JavaScript,并将事件处理程序附加到按钮。这意味着在加载页面后会有短暂的时间窗口,其中页面功能不完整。如果您在测试过程中碰到那个窗口,就会发生奇怪的事情。
要正确处理此问题,您将必须:
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"))
));