我可以让Selenium WebDriver等待每个动作吗? (用于调试目的)

时间:2018-07-05 15:11:48

标签: java selenium wait bdd webdriverwait

我正在从事BDD项目。 有时候,测试进行得太快了,以至于开发人员无法在运行时看到正在发生的事情。

目前,我正在解决它,放置类似

Thread.sleep(humanWaitTime) 

在每种方法之前,但无法达到编写高效代码的目的。

有什么方法可以全局设置此值,以便在进行回归测试时可以很容易地将其取出,而不会使我的代码混乱吗?

谢谢!

3 个答案:

答案 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并假等待不存在的元素, 您应该:

  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 方法中的计时器)

P.S。抱歉,格式错误=(