我可以在多个顺序等待中重用 WebDriverWait 吗?

问题描述 投票:0回答:2

鉴于我需要等待一个文本框出现,做一些事情,稍后我需要等待另一个文本框。 我想知道这段代码是否正确:

var waitForTextBox = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
waitForTextBox.Until(ExpectedConditions.ElementIsVisible(By.Id("txtFirstName"))).SendKeys("John");
waitForTextBox.Until(ExpectedConditions.ElementIsVisible(By.Id("txtLastName"))).SendKeys("Skeet");

或者如果不重用 waitForTextBox,我需要这样做:

var waitForFirstName = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
waitForFirstName.Until(ExpectedConditions.ElementIsVisible(By.Id("txtFirstName"))).SendKeys("John");

var waitForLastName = new WebDriverWait(driver, TimeSpan.FromSeconds(30));              
waitForLastName.Until(ExpectedConditions.ElementIsVisible(By.Id("txtLastName"))).SendKeys("Skeet");
c# selenium selenium-webdriver webdriverwait
2个回答
7
投票

重复使用 WebDriverWait 对象进行多次“等待”是最好的。唯一需要不同 WebDriverWait 对象的情况是需要两个不同的超时时间。否则,WebDriverWait 保留的唯一状态是驱动程序、等待多长时间以及应忽略的异常类型列表。


3
投票

好吧,我找到了WebDriverWait和Until方法的源代码,我发现重用这个对象没有问题:

    public virtual TResult Until<TResult>(Func<T, TResult> condition, CancellationToken token)
    {
        if (condition == null)
        {
            throw new ArgumentNullException("condition", "condition cannot be null");
        }

        var resultType = typeof(TResult);
        if ((resultType.IsValueType && resultType != typeof(bool)) || !typeof(object).IsAssignableFrom(resultType))
        {
            throw new ArgumentException("Can only wait on an object or boolean response, tried to use type: " + resultType.ToString(), "condition");
        }

        Exception lastException = null;
        var endTime = this.clock.LaterBy(this.timeout);
        while (true)
        {
            token.ThrowIfCancellationRequested();

            try
            {
                var result = condition(this.input);
                if (resultType == typeof(bool))
                {
                    var boolResult = result as bool?;
                    if (boolResult.HasValue && boolResult.Value)
                    {
                        return result;
                    }
                }
                else
                {
                    if (result != null)
                    {
                        return result;
                    }
                }
            }
            catch (Exception ex)
            {
                if (!this.IsIgnoredException(ex))
                {
                    throw;
                }

                lastException = ex;
            }

            // Check the timeout after evaluating the function to ensure conditions
            // with a zero timeout can succeed.
            if (!this.clock.IsNowBefore(endTime))
            {
                string timeoutMessage = string.Format(CultureInfo.InvariantCulture, "Timed out after {0} seconds", this.timeout.TotalSeconds);
                if (!string.IsNullOrEmpty(this.message))
                {
                    timeoutMessage += ": " + this.message;
                }

                this.ThrowTimeoutException(timeoutMessage, lastException);
            }

            Thread.Sleep(this.sleepInterval);
        }
    }

我会将之前的答案标记为正确,只是将其放在这里以获得更详细和添加的权威来源。

© www.soinside.com 2019 - 2024. All rights reserved.