我正在做一个 BDD 项目。有时,测试进行得太快,开发人员无法看到运行它们时发生了什么。
目前我正在解决它放置类似的东西
Thread.sleep(humanWaitTime)
在每个方法之前,但它违背了编写高效代码的目的。
有什么方法可以全局设置它,以便在进行回归测试时可以轻松取出它而不会使我的代码混乱?
谢谢!
我正在做一个 BDD 项目。有时,测试进行得太快,开发人员无法看到运行它们时发生了什么。
目前我正在解决它放置类似的东西
Thread.sleep(humanWaitTime)
在每个方法之前,但它违背了编写高效代码的目的。
有什么方法可以全局设置它,以便在进行回归测试时可以轻松取出它而不会使我的代码混乱?
谢谢!
您可以使用 WebDriverEventListener 和假等待不存在的元素,您应该:
public class CustomDriverListener implements
WebDriverEventListener
并实现所有方法在这个类中添加下一个方法:
private void fakeWaiter(WebDriver driver) {
WebDriverWait wait = new WebDriverWait(driver, 20);
try {
wait.until(listenerDriver -> listenerDriver.findElement(By.xpath("//[.='it'sFakeElement']")));
} catch (org.openqa.selenium.TimeoutException e) {
//ignore it
}
}
将此方法的调用添加到您需要的方法中,例如:
@Override
public void afterFindBy(By by, WebElement element, WebDriver driver) {
fakeWaiter(driver);
}
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
fakeWaiter(driver);
}
@Override
public void afterChangeValueOf(WebElement element, WebDriver driver, CharSequence[] keysToSend) {
fakeWaiter(driver);
}
@Override
public void afterScript(String script, WebDriver driver) {
fakeWaiter(driver);
}
创建 EventFiringWebDriver 对象并注册您的 CustomDriverListener:
WebDriver webDriver = new ChromeDriver();
EventFiringWebDriver driver = new EventFiringWebDriver(webDriver);
driver.register(new CustomDriverListener());
现在,如果您在测试中使用“驱动程序”,所有操作都会变慢(取决于fakeWaiter方法中的计时器)
PS抱歉格式错误=(
您可能可以使用隐式等待,
driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
让我们说在你的代码块之上,你写: -
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
然后,在您的代码的每一行之前,webdriver 实例将等待 15 秒,您不必在每条语句之后给出等待时间。
隐式等待将告诉 Web 驱动程序在抛出“无此类元素异常”之前等待一定的时间。默认设置为 0。一旦我们设置了时间,Web 驱动程序将在抛出异常之前等待该时间。