我正在从事BDD项目。 有时候,测试进行得太快了,以至于开发人员无法在运行时看到正在发生的事情。
目前,我正在解决它,放置类似
Thread.sleep(humanWaitTime)
在每种方法之前,但无法达到编写高效代码的目的。
有什么方法可以全局设置此值,以便在进行回归测试时可以很容易地将其取出,而不会使我的代码混乱吗?
谢谢!
答案 0 :(得分:0)
有什么方法可以全局设置此项,否。
当您写Thread.sleep(humanWaitTime)
时,执行将在您在humanWaitTime中提到的确切时间段内停止。
现在,Thread.sleep()
是最糟糕/极端的明确等待。这会将条件设置为要等待的确切时间段。因此,在这种情况下,您将必须在任何位置停止执行并查看实际发生的事情。
我建议您使用Explicit等待您的情况。
您可以这样创建WebDriverWait实例:
WebDriver wait = new WebDriverWait(driver, 30); // at fixture level or set up level.
然后您可以在任意位置使用 wait 这样的参考:
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("static id")));
您可以参考以下链接:Selenium official docs
答案 1 :(得分:0)
您可能可以使用隐式等待,
driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
让我们说,在代码块的顶部,您编写:-
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
然后,在代码的每一行之前,webdriver实例将等待15秒钟,您不必在每个语句后给出等待时间。
隐式等待将告诉Web驱动程序等待一定的时间,然后再引发“无此类元素异常”。默认设置为0。设置好时间后,Web驱动程序将等待该时间,然后引发异常。
答案 2 :(得分:0)
您可以使用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 方法中的计时器)
P.S。抱歉,格式错误=(