3

我正在做一个 BDD 项目。有时,测试进行得太快,开发人员无法看到运行它们时发生了什么。

目前我正在解决它放置类似的东西

Thread.sleep(humanWaitTime) 

在每个方法之前,但它违背了编写高效代码的目的。

有什么方法可以全局设置它,以便在进行回归测试时可以轻松取出它而不会使我的代码混乱?

谢谢!

4

2 回答 2

1

您可以使用 WebDriverEventListener 和假等待不存在的元素,您应该:

  1. 创建类:public class CustomDriverListener implements WebDriverEventListener并实现所有方法
  2. 在这个类中添加下一个方法:

    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 } }

  3. 将此方法的调用添加到您需要的方法中,例如:

    @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); }

  4. 创建 EventFiringWebDriver 对象并注册您的 CustomDriverListener

    WebDriver webDriver = new ChromeDriver();
    EventFiringWebDriver driver = new EventFiringWebDriver(webDriver); driver.register(new CustomDriverListener());

现在,如果您在测试中使用“驱动程序”,所有操作都会变慢(取决于fakeWaiter方法中的计时器)

PS抱歉格式错误=(

于 2018-07-10T13:15:19.220 回答
-1

您可能可以使用隐式等待,

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);

让我们说在你的代码块之上,你写: -

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

然后,在您的代码的每一行之前,webdriver 实例将等待 15 秒,您不必在每条语句之后给出等待时间。

隐式等待将告诉 Web 驱动程序在抛出“无此类元素异常”之前等待一定的时间。默认设置为 0。一旦我们设置了时间,Web 驱动程序将在抛出异常之前等待该时间。

于 2018-07-05T20:43:00.770 回答